작성
·
87
1
안녕하세요
학습을하다가 궁금증이 생겨서 질문드립니다.
module d_ff_asyn_rst_en(
input wire clk, d, rst_b, en,
output reg q
);
always @(posedge clk or negedge rst_b or negedge en)
begin
if (!rst_b)
q <= 0;
else if (!en)
q <= 0;
else
q <= d;
end
endmodule
이렇게 async rst, en F/F 설계를 했습니다.
여기서 궁금한게 있습니다.( rst_b로 말씀드리면)
여기서 rst_b가 negedge일때 always문이 동작하고 rst_b ==0 일떄 q <=0 이라고 했는데 negedege일때 rst_b의 값이 0인지 1인지 어떻게 판별을 하나요?
시뮬레이션상에서는 negedge rst_b 트리거가 발생하는 시점에서 rst_b의 값은 0으로판단하고 리셋시키는데 1에서 0으로 바뀌는순간은 기울기가 무한대라서 0인지 1인지 판별할 수 없다고 생각이듭니다...
답변 1
0
안녕하세요 🙂
실제 저희가 waveform 을 보고 있는대로, 1 -> 0 으로 변하는 순간 (edge) 의 기울기 무한대는 눈으로 확인가능합니다. 하지만 이 edge 의 기울기를 현재 저희가 사용하는 simulation tool 의 waveform 상에서는 불가능 한것으로 알고있습니다. 저희는 아날로그가 아닌, 디지털을 설계하고 있죠. 아날로그 설계라면 이런 기울기가 중요한 요소겠지만, 디지털은 edge 라는 표현으로 충분히 커버된다고 생각합니다.
=====================================
Verilog 에서의 always 블록의 동작에 대해 이해하는 것이 중요합니다. 특히 @(posedge clk or negedge rst_b or negedge en)
구문은 세 가지 조건 중 하나가 발생할 때마다 항상 블록이 트리거된다는 것을 의미합니다. 이 세 가지 조건은 다음과 같습니다:
clk
의 상승 에지 (posedge)
rst_b
의 하강 에지 (negedge)
en
의 하강 에지 (negedge)
negedge rst_b
는 rst_b
가 1에서 0으로 변하는 순간을 의미합니다. 이 순간에 항상 블록이 트리거되고, 블록 내부의 조건문이 실행됩니다.
if (!rst_b)
q <= 0;
이 부분은 rst_b
가 0일 때 q
를 0으로 설정하라는 의미입니다. 즉, rst_b
의 하강 에지가 발생( 1-> 0)하면 rst_b
가 0이 되었음을 의미하므로 조건문이 참이 되고, q
가 0으로 설정됩니다.
Verilog 시뮬레이션에서 negedge rst_b
는 rst_b
가 1에서 0으로 변하는 순간을 정확히 인식하며, 이 순간 rst_b
는 0으로 간주됩니다. 따라서, 에지가 발생한 후 조건문 if (!rst_b)
는 rst_b
가 0임을 정확히 판단하고, q
를 0으로 설정합니다.
즐공하세요 🙂