HDLBits问题记录:DFFs & Gates

  • always块的理解
  • 时序电路/组合电路逻辑编写的考虑

//问题代码
module top_module (
    input clk,
    input x,
    output z
); 
        
    always@(posedge clk)begin
        reg d0,d1,d2;
        d0<=x^d0;
        d1<=x&~d1;
        d2<=x|~d2;
        z<=~(d0|d1|d2);
    end
endmodule

问题分析:

1、Verilog 中,寄存器应该在模块级别声明,而不是在过程块内部。

在always块内部发生的是每次clk上升沿触发事件后,重复进行的操作,寄存器会重复创建,这是不希望发生的。

2、中间量未初始化

3、输出的性质未明确

z输出是一个组合逻辑输出,在任何时刻根据信号变化变化,而不是等到clk变化才触发变化

在硬件逻辑中时序逻辑和组合逻辑应当分开。

4、重复赋值问题

//寄存器初始化
//√
reg d0=0;
//×
reg d0;
assign d0=0;
//因为always里面会进行非阻塞赋值
//assign为持续赋值,和寄存器的行为不兼容

改进分析:


//参考链接:https://zhuanlan.zhihu.com/p/61146736
module top_module (
    input clk,
    input x,
    output z
); 

    reg q1 = 0;
    reg q2 = 0;
    reg q3 = 0;

    always @ (posedge clk)
        begin
            q1 <= x ^ q1; 
        end

    always @ (posedge clk)
        begin
            q2 <= x & (~q2);
        end

    always @ (posedge clk)
        begin
            q3 <= x | (~q3);
        end

    assign z = ~(q1 | q2 | q3); 

endmodule


1、always分块

  • 每个 always 块对应一个触发器或一组相关的触发器。
  • 这种方法提高了代码的可读性和模块性。

2、always同步性:

  • 在硬件实现中,所有由同一时钟边沿触发的 always 块是同步操作的。
  • 它们在同一个时钟边沿同时执行,没有先后顺序。
  • 非阻塞赋值<=保所有赋值在当前时间步结束时同时发生,不受 always 块执行顺序的影响。

3、always避免依赖性:

  • 应避免在不同的 always 块之间创建依赖关系。
  • 每个 always 块应该只依赖于其输入和自己的前一个状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值