Verilog学习日志(2021.7.13)

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]上面。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值