2021.7.13
1.把MUX的五道题全部做完。
(60)设计一个2选1MUX。
(61)设计一个处理100位并行数据的2选1MUX。
(62)设计一个9选1MUX。
(63)设计一个256选1MUX。
(64)设计一个4 bit为单位,256选1的MUX。
//我一开始选择使用assign语句:
assign out = in[ (4*sel)+3 : 4*sel ];
在综合的时候报错:
sel is not a constant File
去知乎问,被破防了,他们说这是用写C的角度想问题。
解决方案一:
assign out = { in[(4*sel)+3] ,in[(4*sel)+2],in[(4*sel)+1],in[4*sel] };
//最简单的就是直接用concatenation把每一位列出来
解决方案二:
assign out = in[sel*4 +: 4];
//使用片选操作符”+:”,表示从sel*4位开始,片选4位所组成的向量。
解决方案三:
wire [9:0] sel_shift; //为防止sel移位后高位被截断,所以设定sel_shift有10位
assign sel_shift = sel << 2; //sel_shift = sel*4;
assign out = in >> sel_shift;
//因为赋值语句左右向量长度不相等,所以移位后向量in的高位被截断,依旧可以实现。
2.提前完成任务,就多整点活吧。
(65)设计一个半加器。
(66)设计一个全加器。
(67)实例化三次全加器,设计一个处理3位向量的串行进位加法器。
(68)设计一个包含4级全加器的串行进位加法器。
//第一次报错因为该句:
assign mid_cin[3:0] = { cout[2:0],0 };
报错信息如下:
unsized constants are not allowed in concatenations File
如果改成如下就没有错误:
assign mid_cin[3:0] = { cout[2:0],1‘b0 };
事实证明使用位连接符一定要标注位宽。
//我做这道题的思路是实例化了4个全加器,但是其实直接写:
assign sum = x + y;
就可以,x + y的溢出位会直接加到sum[4]上面。