HDL_BITS--移位寄存器中非阻塞赋值

本文介绍了如何在Verilog中设计一个4位移位寄存器电路(top_module),使用MUXDFF模块并连接SW、clk、KEY和LEDR。同时,讨论了在描述组合逻辑和时序逻辑时如何正确使用阻塞和非阻塞赋值以避免时序图错误。
摘要由CSDN通过智能技术生成

考虑如下所示的n位移位寄存器电路:

为移位寄存器编写一个顶级Verilog模块(名为top_module),假设n = 4。实例化 4 个 顶级模块中 MUXDFF 子电路的副本。假设您将在 DE2 板上实现电路。

  • 将 R 输入连接到 SW 开关,
  • clk 到 KEY[0]
  • E 转 KEY[1]
  • L 到 KEY[2] 和
  • w 更改为 KEY[3]。
  • 将输出连接到红灯 LEDR[3:0]。

Verilog代码:

module top_module (
    input [3:0] SW,
    input [3:0] KEY,
    output [3:0] LEDR
); //
    MUXDFF mux_init(
        .R	(SW),
        .clk(KEY[0]),
        .E	(KEY[1]),
        .L	(KEY[2]),
        .W	(KEY[3]),
        .Q	(LEDR)
    );
endmodule

module MUXDFF (
    input [3:0] R,
	input clk,
    input E,
    input L,
    input W,
    output  reg [3:0] Q
);
    //wire temp0,temp1,temp2,temp3;
    always@(posedge clk)
        begin
            //temp3 <= E?W:Q[3];
            Q[3]<= L?R[3]:(E?W:Q[3]);
        end
    always@(posedge clk)
        begin
            //temp2 <= E?Q[3]:Q[2];
            Q[2]<= L?R[2]:(E?Q[3]:Q[2]);
        end
    always@(posedge clk)
        begin
            //temp1 <= E?Q[2]:Q[1];
            Q[1]<= L?R[1]:(E?Q[2]:Q[1]);
        end
    always@(posedge clk)
        begin
            //temp0 <= E?Q[1]:Q[0];
            Q[0]<= L?R[0]:(E?Q[1]:Q[0]);
        end
endmodule

起初我是写了4个always块,每个always块内由temp保存中间变量W or Q,然后再由L判断输出,但是可能在非阻塞赋值存在延误,导致时序图错误,后总结理解了网上的阻塞赋值和非阻塞赋值的区别:什么时候使用阻塞赋值,什么时候使用非阻塞赋值

在描述组合逻辑电路的时候,使用阻塞赋值,比如 assign 赋值语句和不带时钟的 always 赋值语句,这种电路结构只与输入电平的变化有关系。

②在描述时序逻辑的时候,使用非阻塞赋值,综合成时序逻辑的电路结构,比如带时钟的 always 语句;这种电路结构往往与触发沿有关系,只有在触发沿时才可能发生赋值的变化。
这段数字设计综合工具的执行脚本包含了多个命令,每个命令的作用如下: 1. `source -verbose "../const/design_info.tcl"`:引入常量文件 `design_info.tcl`。 2. `set_attribute information_level 9`:设置综合信息输出级别为 9。 3. `set_attribute hdl_track_filename_row_col true`:在门级网表添加源代码文件名、行号和列号等信息。 4. `set_attribute hdl_generate_index_style %s_%d`:设置门级网表的索引样式为 `%s_%d`,其 `%s` 表示模块或信号的名称,`%d` 表示该模块或信号在其父模块的序号。 5. `set_attribute hdl_generate_separator _`:设置门级网表模块和信号之间的分隔符为下划线。 6. `set_attribute hdl_search_path $SEARCH_PATH`:设置综合工具的搜索路径为 `$SEARCH_PATH`,其 `$SEARCH_PATH` 是常量文件定义的路径。 7. `set_attribute library $LIB_LIST_MAX`:将当前设计的综合库设置为工程定义的最大库列表。 8. `read_hdl -sv $RTL_LIST -define LEAF_BHV`:读取 Verilog/SystemVerilog 文件,其 `$RTL_LIST` 是常量文件定义的文件列表,`-define LEAF_BHV` 表示定义了宏 `LEAF_BHV`。 9. `set_attr blackbox true [find / -hdl_arch clock_tree_model*]`:将时钟树模型标记为黑盒。 10. `elaborate $DESIGN_TOP`:对顶层模块进行综合。 11. `set_attribute write_vlog_bit_blast_constants true`:在 Verilog 输出文件写入常量的位表示。 12. `set_attribute write_vlog_unconnected_port_style none ;#(none/partial/full)`:在 Verilog 输出文件处理未连接的端口,`none` 表示不处理。 13. `set_attribute hdl_undriven_output_port_value none`:定义未驱动输出端口的默认值为 `none`。 14. `set_attribute hdl_unconnected_input_port_value x`:定义未连接输入端口的默认值为 `x`。 15. `set_attribute hdl_allow_inout_const_port_connect false`:禁止连接 inout 类型端口和常量端口。 16. `syn_gen -effort high`:进行综合,`-effort high` 表示使用高效的综合策略。 17. `change_names -regexp -allowed "a-zA-Z0-9_" -subdesign -max_length 20`:对子模块的名称进行修改,将不符合规范的字符替换为下划线,最大长度为 20 个字符。 18. `change_names -regexp -allowed "a-zA-Z0-9_" -instance`:对实例的名称进行修改,将不符合规范的字符替换为下划线。 19. `change_names -regexp -allowed "a-z0-9_" -net`:对信号的名称进行修改,将不符合规范的字符替换为下划线。 20. `write_hdl -equation > $GNR_NETLIST`:将门级网表输出到 `$GNR_NETLIST` 文件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值