我正在学习 Verilog 的课程,并遇到了一些对我来说有点奇怪的事情。 如果我用 VHDL(我更习惯)编写 DFF,我会这样做:
DFF : process(CLK, RESET_N)
begin
if RESET_N = '0' then
Q <= '0';
elsif rising_edge(CLK) then
Q <= D;
end if;
end process DFF;
我在 Verilog 中尝试了类似的方法:
always @ (clk, reset_n) begin
if(reset_n == 0) begin
q = 0;
end else if(posedge clk) begin
q = d;
end
end
但是,在执行此操作时,我收到编译错误 - 靠近“thought”:语法错误,意外的 posege。 我使用 Questasim 作为我的模拟器。
我的问题是,Verilog 如何处理
posedge
以及它与 VHDL 的 rising_edge
有何不同? 我只能在 always
块的敏感度列表内使用 Verilog 中的 posege 吗?
posedge
从技术上讲是 Verilog 中的“事件表达式”。这不是一个表达。 if
语句的语法是 if(expression)
,所以你运气不好。
Verilog 和 VHDL 版本略有不同。
rising_edge
是在 std_logic_1164
中定义的函数。基本上,如果信号是 0
或 L
,现在是 1
或 H
,则表示有上升沿。 Verilog的posedge
由LRM定义,包括x
和z
。请参阅 2005 LRM 的第 133 页,但请注意,例如,0
到 z
是 posedge
。
您可以在此处找到触发器等效项(以及许多其他 Verilog/VHDL 等效项)。