【点滴积累FPGA】例说阻塞与非阻塞的差别
阻塞和非阻塞的差别直观上表现在<= 和=的差别.但要表现出这个差别是有条件的.看一下三个测试模块:
module test1(
input clk,
input din,
output reg dout
);
reg a,b,c;
always @ (posedge clk)a=din;
always @ (posedge clk)b=a;
always @ (posedge clk)c=b;
always @ (posedge clk)dout=c;
endmodule
module test2(
input clk,
input din,
output reg dout
);
reg a,b,c;
always @ (posedge clk)
begin
a<=din;
b<=a;
c<=b;
dout<=c;
end
endmodule
module test3(
input clk,
input din,
output reg dout
);
reg a,b,c;
always @ (posedge clk)
begin
a=din;
b=a;
c=b;
dout=c;
end
endmodule
1,test1,test2模块产生了正确的流水寄存器.而test3没有,只产生了一个8位register.
2,test3是该非阻塞的时候没有正确非阻塞.应该使用<=;
3,在test1时候虽然是阻塞赋值但是由于是采用单独的always进行边缘赋值,因此产生了正确的结果.
4,形式服从于内容,只有在内容一样的时候,形式的作用才体现出来(test2和test3就是通过形式区别内容的).要对形式和内容的辨证关系有明确的意识.抓住内容实质,重视形式表现.
5,其实完全没有必要去死记阻塞(=)与非阻塞(<=)的差别,知道到什么样的电路需要用什么样的HDL去表达就可以,是去理解。我每次在说阻塞非阻塞对应符号时候都有点胆战心惊,生怕对应错,但是我知道什么时候要区别<=和=这两个符号,什么时候不需要区别以及区别的时候用<=还是=,这应该理解了实质,就够了。
6,另外千万不要认为只要是带有<=都生成了寄存器,还要看触发条件是否为边缘触发。always@* outp<=inp; 这句就相当于直接连通inp到outp而没有生成寄存器。
http://cache.amobbs.com/bbs_upload782111/files_41/ourdev_652541BOEMS1.JPG
test1 test2模块生成的RTL原理图 (原文件名:test12.JPG)
http://cache.amobbs.com/bbs_upload782111/files_41/ourdev_652542WF9CAM.JPG
test3模块生成的RTL原理图(原文件名:test3.JPG) 这么多人用Verilog,我没学过,一直用VHDL,好像VHDL中没有阻塞非阻塞概念。哪位两种语言都通的解释下,从上面图看,第一张是移位寄存器,第二张是触发器,实际上写代码是自己心中有数的,感觉那个概念是教材书本上的作用,实际中,用VHDL,有经验的人不会错的。不当之处楼下指出,谢谢 http://www.cnblogs.com/yuphone/archive/2010/11/10/1874465.html vhdl也是有所谓阻塞和非阻塞的,当然变量属性就决定了的。 test3是被综合软件优化掉了吧 我的理解:当有几个《=赋值语句时,就是并行执行,如果有延迟就按各自的延迟执行。=赋值语句也可以实现非阻塞的功能,只要将讲右侧的值先寄存在一个变量中。 不错 mark 回复【楼主位】mcupro 李伟
-----------------------------------------------------------------------
VHDL里面有 信号代入和变量值代入的区别。 mark
页:
[1]