混合使用阻塞/非阻塞语句
verilog语言的一个难点就是阻塞语句和非阻塞语句。一般来说,always语句块中如果对组合逻辑建模,敏感事件为电平触发,并且使用阻塞赋值语句;对时序逻辑建模,敏感时间为沿触发,并且使用非阻塞语句。
深入的说,
对于阻塞语句,其综合出的组合逻辑输出,被馈送到其后引用它的语句的
组合逻辑的输入端,也即后面的语句引用其新值。
对于非阻塞语句,其综合出的触发器输出,被馈送到其后引用它的语句的
组合逻辑的输入端,也即后面的语句引用其旧值。
不管是阻塞赋值还是非阻塞赋值语句,若在该句之前对其值(除纯粹的临时变量)进行引用,则只能引用其上个时钟周期赋予的旧值。
在边沿敏感周期行为always顺序块中使用阻塞、非阻塞赋值语句,只对其后引用其值的语句产生影响。
在边沿敏感的周期行为always语句块中,若变量被某条语句引用上个时钟周期赋的值(旧值),则该变量综合出的触发器的输出端被馈送到引用它的语句的输入端;若该变量被某条语句引用当前时钟周期赋的值(新值),则该变量综合出的组合逻辑的输出端被馈送到引用它的语句的输入端。
下面有几段类似的代码,在Quartus得到RTL结果,就可以对这两种语句有一些感觉了,不过我不推荐这样的混合写法,一方面容易出错,另一方面,不容易把握硬件结果,会使Verilog代码风格走向软件。这些代码权当学习使用啦!(因为上传的图片不清楚,综合后的结果大家在Quartus实验一下就可以看到了)
module test(clk,din,regand,regor,regxor);
input clk,din;
output regand,regor,regxor;
reg regand,regor,regxor;
always@(posedge clk)begin
regxor=regxor^din;
regor<=regxor|din;
regand<=regor&din;
end
endmodule
module test(clk,din,regand,regor,regxor);
input clk,din;
output regand,regor,regxor;
reg regand,regor,regxor;
always@(posedge clk)begin
regor<=regxor|din;
regxor=regxor^din;
regand<=regxor&din;
end
endmodule
module test(clk,din,regand,regor,regxor);
input clk,din;
output regand,regor,regxor;
reg regand,regor,regxor;
always@(posedge clk)begin
regor=regxor|din;
regxor=regxor^din;
regand<=regxor&din;
end
endmodule
文章评论(0条评论)
登录后参与讨论