Kim Seon Deok
[Verilog] Sequential Logic Modeling - Flip Flop 본문
조합회로는 현재 들어오는 입력에 의해 출력이 결정된다.
순차회로는 현재의 입력과 과거의 입력, 기억된 상태값에 의해 출력이 결정된다. 과거의 입력과 현재의 상태값을 일정기간 동안 저장하는 기억소자와 조합회로로 구성된다.
ex) register, shift register, counter, 직렬/병령 변환기, 유한 상태머신, 주파수 분주기. 펄스 발생기 등등
순차회로 모델링
always 블록을 이용한 behavioral modeling, gate primitive, module instance, concurrent assign문 등 다양한 베릴로그 구문을 사용한다.
할당문의 형태는 blocking, nonblocking 문에 따라 회로의 동작과 플립플롭의 개수가 달라진다.
래치와 플립플롭은 always 구문 안에 if 조건문을 이용해 모델링하면 되는데, 래치같은 경우 if 문만 있고 else문은 굳이 작성하지 않아 값을 한 클럭 유지시키도록 한다.
플립플롭
클럭 신호의 상승 또는 하강 엣지에 동기화되어 동작하는 저장소자이다.
플립플롭 중에는 SR, JK, T, D 플립플롭이 있는데, 이 중 반도체 설계에 이용되는 플립플롭은 D 플립플롭이다.
래치와 다르게 플립플롭은 클럭이 0 → 1로(positive edge triggered), 1 → 0으로(negative edge triggerd) 변할 때 값이 변한다. edge triggered가 일어나고 다음 클럭에 또 일어날 때 까지 그동안 출력값을 유지 / 저장 한다.
클럭이 상승에지일 때 d값이 1이면 q값이 1 , q_bar값이 0이 되고, 클럭이 상승에지일 때 d값이 0이면 q값이 0, q_bar값이 1이 된다. q와 q_bar값은 다음 상승엣지가 들어오기 전까지 값을 유지한다.
- synchronous active high set/reset
- synchronous active low set/reset
- asynchronous active high set/reset
- asynchrounous active low set/reset
래치 때와 마찬가지로 플립플롭도 asyncrhnous set/reset에 따라 파형이 달라진다.
synchronous active low reset
synchronous active low reset d 플립플롭의 파형이다.
클럭은 10ns마다 반전되어 들어온다.
클럭의 상승엣지(posedge)마다 d값에 맞추어 q값과 qb값이 바뀌고 (qb는 q의 반전값) 다음 상승엣지가 들어올 때까지 값을 저장한다.
클럭의 상승엣지에서 rst_n이 active_low인 상태이면 (rst _n = 0), q값은 d값이 1이든 0이든 상관없이 rst_n에 맞추어 0이되고 qb는 1이 된다.
클럭의 상승엣지에서 rst_n이 actice_low상태에서 벗어나면 (rst_n = 1), q와 qb값은 다시 d값을 따라 값이 바뀌고 값을 저장한다.
asynchronous active low reset
asynchronous reset이므로 clk와 무관하게 동작하는 rst_n 단자가 추가되었다.
asynchronous active low reset d 플립플롭의 파형이다.
클럭은 10ns마다 반전되어 들어온다.
클럭의 상승엣지(posedge) 마다 d 값에 맞추어 q값과 qb값이 바뀌고 (qb는 q의 반전값) 다음 상승엣지가 들어올 때까지 값을 저장한다
클럭의 상승엣지와 무관하게 rst_n이 1에서 0으로 active_low되면(rst_n의 negedge 발생) rst_n이 하강엣지되는 시점에서 q값은 d값이 1이든 0이든 상관없이 0이 되고 qb는 1이 되어 rst_n값이 다시 0에서 1이 될 때까지 유지한다.
클럭의 상승엣지와 무관하게 rst_n이 active low상태에서 벗어나고 클럭의 상승엣지가 들어오면 q와 qb값은 다시 d값에 맞추어 바뀌고 그 값을 저장한다.
Blocking과 Nonblocking 할당문
플립플롭이 포함된 회로에 blocking 할당문을 사용
module seq_blk(clk, a, b, c, d, e, y);
input clk, a, b, c, d, e;
output y;
reg m, n, y;
always @(posedge clk) begin
m = ~(a & b);
n = c | d;
y = ~(m | n | e); // 윗윗줄의 m, 윗줄의 n을 사용
end
endmodule
blocking문을 사용한 경우 m, n 값이 y값을 출력을 출력하기 위해 입력으로 사용되기 때문에 플립플롭이 1개만 생성된다.
결과적으로 플립플롭은 1개 생성된다.
y = ~(m | n | e)가 가장 위로 올라가면 플립플롭은 3개 생성된다. → 순서에 따라 플립플롭 개수 달라짐
플립플롭이 포함된 회로에 Nonblocking 할당문을 사용
module seq_nonblk(clk, a, b, c, d, e, y);
input clk, a, b, c, d, e;
output y;
reg m, n, y;
always @(posedge clk) begin
m <= ~(a & b); // 우변을 동시에 먼저 판단
n <= c | d;
y <= ~(m | n | e); // m,n은 이전 클럭의 결과값 m,n
end
endmodule
nonblocking문을 사용한 경우 우변을 먼저 판단한 다음 좌변에 그 판단한 값을 할당해준다.
따라서 ~(a & b), (c | d), ~(m | n | e)를 먼저 판단하고 그 결과값을 m, n, y 에 할당해준다.
이 때 ~(m | n | c)의 m, n값은 이전 클럭에서 할당된 m, n값이다.
결과적으로 플립플롭은 3개가 생성된다.
blocking할당문에서 문장 순서의 영향
always @(posedge clk) begin
q0 = d;
q1 = q0;
q2 = q1;
q3 = q2;
end
/// 문장 순서 바꿈
always @(posedge clk) begin
q3 = q2;
q2 = q1;
q1 = q0;
q0 = d;
end
nonblocking할당문에서 문장 순서의 영향
always @(posedge clk) begin
q0 <= d;
q1 <= q0;
q2 <= q1;
q3 <= q2;
end
// 문장 순서를 바꿈
always @(posedge clk) begin
q3 <= q2;
q2 <= q1;
q1 <= q0;
q0 <= d;
end
따라서 blocking문을 사용하느냐, nonblocking문을 사용하느냐에 따라 플립플롭 개수가 달라지고, 각각의 경우에서 문장의 순서가 바뀐다면 회로도 달라진다.
blocking문 → 문장 순서에 따라 결과적 회로모습과 플립플롭 개수가 달라질 수 있다.
nonblocking문 → 문장 순서에 상관없이 플립플롭 생성됨. 좌변의 객체는플립플롭의 출력이 된다.
'Verilog' 카테고리의 다른 글
[Verilog] Sequential modeling - Shift register, Counter (0) | 2022.12.11 |
---|---|
[Verilog] Sequential Logic Modeling - Latch (0) | 2022.12.10 |
[Verilog] Combinational Logic Modeling (0) | 2022.12.10 |
[Verilog] Structural modeling - Generate statement (0) | 2022.12.09 |
[Verilog] Structural modeling - module parameter (0) | 2022.12.09 |