当前位置:   article > 正文

HDLBits_Verilog学习笔记Ⅰ——Verilog Language_Procedures

HDLBits_Verilog学习笔记Ⅰ——Verilog Language_Procedures

知识点

assign out1 = a & b | c ^ d; 左边必须要是net类型(例如wire)

always @(*) out2 = a & b | c ^ d;左边必须是变量类型(例如reg)

always @(posedge clk) 

组合逻辑: always @(*)
时序逻辑: always @(posedge clk)

 时序逻辑always块相对于组合逻辑always块的不同点在于输出端多了一组触发器或寄存器 

连续赋值:        (assign x=y;)    // 不能在过程块(always块)内使用;
过程阻塞赋值:    (x=y;)            // 只能在过程块内使用;
过程非阻塞赋值:    (x<=y;)            // 只能在过程块内使用。可以把非阻塞赋值的符号“<=”中的<记成一个触发器 

    assign out_assign = a^b;
    always @(*) out_always_comb = a^b;
    always @(posedge clk) out_always_ff = a^b;

同样是a^b,但是由于    always @(posedge clk)  属于阻塞赋值,计算完的结果会放在寄存器里面,等到下一个时钟信号来了,才可以输出

always @(*) begin
    casez (in[3:0])
        4'bzzz1: out = 0;   // in[3:1] can be anything ,z表示不关心位
        4'bzz1z: out = 1;
        4'bz1zz: out = 2;
        4'b1zzz: out = 3;
        default: out = 0;
    endcase
end

                为避免生成不必要的锁存器,必须在所有可能的情况下为所有的输出赋值(参见31.If statement latches)。这可能涉及许多不必要的输入,会多打很多字。 一个简单的解决方法是在case语句之前为输出赋一个“默认值”例如:

always @(*) begin
    up = 1'b0; down = 1'b0; left = 1'b0; right = 1'b0;//先定义一个默认值
    case (scancode)
        ... // Set to 1 as necessary.
    endcase
end

易错点

1、进入module之后需要有always语句块(end结束)

2、casez语句块注意需要有endcase,每个语句块后面需要加分号“;”,default 不是必需品

3、[7:0]一共是8位,老是看错!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/905938
推荐阅读
相关标签
  

闽ICP备14008679号