Verilog学习日志(2021.7.11)

这篇博客记录了作者在学习Verilog过程中遇到的问题与解决方法,包括理解条件语句的使用,避免常量驱动器错误,使用归约运算符计算奇偶校验值,以及在always过程块中运用for循环。作者还探讨了在设计串行进位加法器时如何实例化和使用generate语句,同时提到了Vivado综合器的限制。
摘要由CSDN通过智能技术生成

2021.7.11

1.智齿恢复的差不多了,继续学习。

(34)明白了,我审题目审错了啊...真值表都写错了...低级错误

(35)为了防止出现综合出寄存器的情况,在条件语句中应该把所有条件全部写全。前面用了default作为条件的方法,这里引入另一个思路:就是先给条件语句的输出值提前赋值为初始值,再在条件语句中对对应输出进行覆盖赋值。

(36)Verilog有一个比较短的条件语句名为conditional operator。

①它也可以被综合成MUX。

②不论是连续赋值还是过程赋值都可以用,很方便。

//今天犯了一个很重要的错误:

//因为在连续赋值当中,所有代码都是并行执行的,所以对于同一个变量,给它不同的地址,就会出现常量驱动器出错。

//所以如果要实现类似C语言的串行执行,从而对同一个变量进行多次赋值操作,就要通过过程块。

//还有以下错误(Incorrect):

//原因也是一样,虽然因为没有对同一变量进行多次赋值,但是对intermediate_result2赋值时,intermediate_result1的赋值语句也在同步执行,所以这时调用intermediate_result1也是愚蠢的。

//欸,那为什么这样就是对的呢?

//如果用并行处理的思路代入的话,第三个赋值语句为啥就能够调用两个中间值呢?

//最后我用自己的方法写完了:过程块中使用临时值temp来选出最小值或者是用中间值intermediate_result也行。

(37)归约运算符可以用于对一个多位向量进行逐位运算,合并成一位。

题目让我计算一个8位向量的奇偶校验值,用归约异或运算符来做。

(38)把各种归约运算符运用在100输入的运算当中。

(39)学习如何在always过程块之中运用for循环。

//for循环的基本结构如下:

integer i;

always @ (*)

       begin

              for ( initial_assignment; condition; step_assignment )

                     /*循环主体*/

       end

①for循环只能在过程块和generate语句中使用。

②引导数i为integer类型,既不是wire也不是reg。

③step_assignment中i=i+1;不能写成i++。

//标准答案中用到了$bits()函数,该函数的返回值为参数向量的位长度。

(40)计算一个255位输入里面1的数目,使用for循环。

//注意:计数类的电路记住用于计数的变量要先初始化成0,不初始化赋值的话缺省为高阻态。

//问题:中文导学里out变量是wire类型的,可是对它的赋值却是在always过程块里用阻塞赋值的形式完成的?

(41)用generate语句或者实例化数组的方式来设计一个100位串行进位加法器。

我一开始以为实例化可以放在always过程块的for循环里面来做,但是其实实例化是一种类似声明变量的性质,只不过声明的是实例。所以for循环里面不能做到多次声明同一个名称的实例(?)//总之这个报错的例子可以之后再研究

后面在参考了实例化数组的一些例子之后,我又写了一个版本,不过考虑到add[0]的cin是直接连到外部引脚的,所以这次add[0]和add[99:1]我依然让它们分开被声明,事实证明这样也会出现类似的报错。

最后我把所有的实例都放在同一次实例化,引入了中间值mid_cin,然后连上mid_cin[0]和外部引脚cin,在最后再通过for循环把mid_cin[99:0]和cout[99:0]接在一起,这样就成功了。

//把代码放到Vivado上面运行的时候发现两个问题:

①Vivado不能识别关键字”int”,只能识别”integer”。

②Vivado的综合器不允许在always过程块当中对wire变量进行过程赋值。

2.算了,最后一题留到明天看完generate语句相关的东西之后再做8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值