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位,老是看错!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值