集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1560|回复: 5

verilog中阻塞的理解与例子

[复制链接]
晓灰灰 发表于 2018-9-10 11:13:46 | 显示全部楼层 |阅读模式
        下面给出一个基于阻塞赋值和非阻塞赋值的多级触发器级联实例,要求将输入数据延迟 3 个时钟周期再输出,并给出对应的 RTL 级结构图和仿真结果。
       
        (1)基于 D触发器的阻塞赋值语句代码如下:
        module pipeb1 (q3, d, clk);
        output [7:0] q3;
        input [7:0] d;                                       
        input clk;
        reg [7:0] q3, q2, q1;
        always @(posedge clk)
        begin
        q1 = d;
        q2 = q1;
        q3 = q2;
        end
        endmodule
       
        上述代码综合后能得到所期望的逻辑电路吗? 答案是否定的, 根据阻塞赋值语句的执行过程可以得到执行后的结果是 q1 = d;q2 = d。实际只会综合出一个寄存器,如图 8-33 所示,并列出下面的警告信息,而不是所期望的三个。其中的主要原因就是采用了阻塞赋值,首先将 d 的值赋给 q1,再将q1 的值赋给q2,依次到q3,但是 q1、q2、q3 的值在赋值前其数值已经全部被修改为当前时刻的 d 值,因此上述语句等效于 q3=d,这和图 8-33 所示的 RTL 结构是一致的。
       

        (2) 如何才能得到所需要的电路呢?如果把 always  块中的两个赋值语句的次序颠倒后再进行分析:先把 q2 的值赋于 q3、再把 q1 的值赋于 q2,最后把 d  赋于q1。这样在先赋值再修改,可以使得 q2,q3 的值都不再是 d 的当前值。修改后的代码如下所列。

        module pipeb2 (q3, d, clk);
        output [7:0] q3;
        input [7:0] d;
        input clk;
        reg [7:0] q3, q2, q1;
        always @(posedge clk)
        begin
        q3 = q2;
        q2 = q1;
        q1 = d;
        end
        endmodule
       
       

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| 晓灰灰 发表于 2018-9-10 11:14:44 | 显示全部楼层
verilog中阻塞的理解与例子
zhangyukun 发表于 2018-9-11 09:20:24 | 显示全部楼层
verilog中阻塞的理解与例子
 楼主| 晓灰灰 发表于 2018-9-11 09:51:13 | 显示全部楼层
verilog中阻塞的理解与例子
 楼主| 晓灰灰 发表于 2018-10-5 10:24:39 | 显示全部楼层
verilog中阻塞的理解与例子
 楼主| 晓灰灰 发表于 2018-10-8 10:43:38 | 显示全部楼层
verilog中阻塞的理解与例子
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-5-1 14:36 , Processed in 0.066472 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表