Verilog posedge与VHDL rising_edge差异及Verilog posedge使用限制咨询
Verilog中posedge的使用问题解析
你遇到的编译错误核心原因是:Verilog的posedge关键字不能像VHDL的rising_edge函数那样,放在if条件判断语句中使用,这是Verilog语法的硬性规定。
VHDL rising_edge与Verilog posedge的核心差异
- VHDL的
rising_edge()是内置函数:它可以在进程内部的条件分支中直接调用,用来检测时钟信号的上升沿,无论进程敏感列表是否包含时钟,只要调用该函数就能完成边沿检测。你之前写的VHDL D触发器就是这种用法,通过rising_edge(CLK)在进程内判断是否触发触发器更新。 - Verilog的
posedge是事件关键字:它仅能用于always块的敏感列表中,用来定义触发always块执行的边沿事件(上升沿),不能在always块内部的条件判断里使用。
posedge的正确使用方式
Verilog中,要实现和你VHDL代码等价的异步复位D触发器,需要把posedge clk和negedge reset_n都放入always块的敏感列表,然后在块内先判断复位条件,再处理时钟触发的逻辑。同时注意:时序逻辑(如触发器)必须使用非阻塞赋值<=,这和VHDL中进程内的信号赋值行为一致。
正确的Verilog代码如下:
always @(posedge clk, negedge reset_n) begin if(!reset_n) begin q <= 1'b0; // 异步复位,低有效 end else begin q <= d; // 时钟上升沿时更新输出 end end
补充说明
如果是同步复位(复位仅在时钟上升沿生效),敏感列表只需要posedge clk,然后在块内先判断复位条件:
always @(posedge clk) begin if(!reset_n) begin q <= 1'b0; // 同步复位 end else begin q <= d; end end
内容的提问来源于stack exchange,提问作者Nathan S
相关产品推荐
相关产品推荐

