verilogalways @(A or E)和always @(A , E)区别
时间: 2023-10-23 17:08:59 浏览: 97
`always @(A or E)`和`always @(A, E)`都是 Verilog 语言中的 always 块,但它们的触发条件不同。
`always @(A or E)`表示只要 A 或 E 的值发生变化,就会触发 always 块中的代码执行。这种触发条件叫做逻辑或触发(OR 触发),即只要其中一个信号发生变化就会触发。
`always @(A, E)`表示只有 A 和 E 的值同时发生变化,才会触发 always 块中的代码执行。这种触发条件叫做边沿触发(EDGE 触发),即只有当 A 和 E 的值同时变化时才会触发。
因此,这两种触发条件有不同的应用场景。逻辑或触发常用于连续的信号采样,而边沿触发常用于时序逻辑设计。
相关问题
module shiftreg_PA(E, A, clk, rst); output A; input E,clk,rst; reg A,B,C,D; always@ (posedge clk or posedge rst) begin if (rst) begin A=0; B=0; C=0; D=0; end else begin A<=B; B<=C; C<=D; D<=E; end end endmodule
这是一个 Verilog 代码段,实现的是一个带复位功能的 4 位移位寄存器。输入信号 E 通过时钟上升沿触发,每次移位时,E 的值会存储在 D 中,D 的值存储在 C 中,C 的值存储在 B 中,B 的值存储在 A 中,A 的值则作为输出信号。当 rst 信号为高电平时,A、B、C、D 四位的值将被同时清零。其中 "<=" 表示非阻塞赋值,即在时钟上升沿到来时,同时将右侧的值赋值给左侧的变量。
always@(posedge Pause)begin if(tp==1)tp=0; else tp=tp+1; end always@(posedge CP or posedge No_water or posedge Open or posedge Start)begin if(Start)c_e=0; else if(No_water|Open)begin if((water_out==1&&s[2:0]==3'b000)||(danger==1&&s[2:0]==3'b011))c_e=1; else c_e=0; end else if(CP)begin if(count[2:0]==3'b010)begin c_t=0;c_e=0;count[2:0]=0;end else if(c_e==1)begin count[2:0]=count[2:0]+3'b001;c_t=1;end else if(c_e==0)count=0; end end assign a=((c_t|CP&finish)|(Start|Set|Pause|Speed))&CP_1k; endmodule
这段 Verilog HDL 代码包含了两个始终块(always block)和一个输出端口(assign)。第一个始终块在输入信号 Pause 上升沿时执行,用于更新变量 tp 的值。如果 tp 等于 1,则将其重置为 0,否则将其加 1。
第二个始终块在输入信号 CP、No_water、Open 或 Start 上升沿时执行,用于更新变量 c_e、c_t 和 count 的值。如果输入信号 Start 为 1,则将变量 c_e 设置为 0。否则,如果 No_water 或 Open 为 1,则检查变量 water_out 或 danger,根据条件将变量 c_e 设置为 1 或 0。如果 CP 为 1,则检查计数器变量 count 的值,根据条件更新变量 c_e 和计数器。最后,将变量 a 的值设置为一些逻辑表达式的结果,该表达式使用输入信号和一些变量的值计算。
阅读全文