HDLBITS学习的一些小细节

运用‘[]’可以对信号进行片选,比如将该信号的高8位赋予一个信号,低8位赋予另外一个信号。

`default_nettype none     // Disable implicit nets. Reduces some types of bugs.
module top_module( 
    input wire [15:0] in,
    output wire [7:0] out_hi,
    output wire [7:0] out_lo );
    assign out_hi = in[15:8];
    assign out_lo = in[7:0];
endmodule

注意的是,assign的类似于将有方向的信号连接,被链接的信号在左侧,驱动信号在右侧,不同于C等软件语言,连线后两者的值是相等的,同时变化。


`default_nettype none

代码中加入这段可以关闭隐式声明,未声明的语句会变成ERROR而不是warning。


组合逻辑块always中,代码顺序执行。

integer i;
always @(*) begin	
     for (i=0; i<8; i++)	//Use integer for pure Verilog.
	     out[i] = in[8-i-1];
end

其中for循环描述的是电路的行为,并不是电路的结构,故必须将其放在always逻辑组合块中。

但是在电路中是不存在这种循环的结构的,在综合时还是会将其解析为电路结构(in的各bit连接到out上)。同时verilog不允许将i定义在for循环中,需要在这之前integer i定义变量。


数字电路中,想要减一个数字,就加上他的补码就好了,项目中用到减法和加法可以参考。


case需要列出所有的输入输出对应关系,不然会出现不必要的锁存器,而casez可以直接在众多输入中找到需要的映射关系,减少代码的工作量。


奇偶校验是检验传输数据中1的个数,当然有奇数有偶数,,这时候就需要用我们的校验位了,通过检验位将传输1的个数变成奇数就是奇校验,变成偶数就是偶校验。比如:

8'b01100100   //原数据
9'b01100100_0 //奇校验
9'b01100100_1 //偶校验

关于for循环中i的定义,Problem 16中的笔记:


HDLBits 上的 solution 中,i 定义于 for 循环的括号中,这在 Verilog 的语法中是不被允许的,是 SystemVerilog 的语法。


probiem64:

assign out = in[sel*4 +: 4];// 从 sel*4 开始,选择比特序号大于sel*4 的 4 位比特,相当于[sel*4+3:sel*4]
assign out = in[sel*4+3 -: 4];	// 从 sel*4+3 开始,选择比特序号小于 sel*4+3 的 4 位比特,相当于[sel*4+3:sel*4]

 assign out = in[ sel*4+3 : sel*4 ]这种语句是不符合verilog语法的。 想要实现的话可以用位拼接

assign out = {in[sel*4+3], in[sel*4+2], in[sel*4+1], in[sel*4+0]};

但是这也不是解决问题的办法,如果out输出是更高位数呢?

在位宽较小的多路选择器中,我们可以使用 assign 语句,三元表达式,case 语句等。在位宽较宽的多路选择器中,需要根据需求灵活地使用位选择符或者位连接符。 


problem 68

如果没有任何的限制的话,直接+就好了,两个4位的相加加上1位进位共5位。

(x+y)会限制 sum为4位。


problem 69

提到的溢出的情况:两个正数相加有进位,覆盖了原来的0;

                                 两个负数相加,符号位变为0。

assign s = a + b;
    assign overflow = ( a[7] && b[7] && ~s[7] ) || (~a[7] && ~b[7] && s[7]);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值