参考文献
[1]、数字芯片实验室(微信公众号)
项目简述
因为最近参加Xilinx暑假计划比较忙,已经很久没写文章了,这篇博客我们将重点讲述Verilog中阻塞逻辑赋值‘=’、非阻塞逻辑赋值‘<=’。看到这里不免大家要嘲笑,这谁不知道,文章的内容咋么越写越倒退了。其实不是这样,绝大多数的同学理解阻塞赋值与非阻塞赋值是组合逻辑语句用阻塞赋值 ‘=’、时序逻辑用非阻塞逻辑赋值‘<=’。那么真的是这样吗? 答案是否定的,其实组合逻辑语句一定用阻塞赋值 ‘=’,时序逻辑也可以用阻塞逻辑赋值‘=’。
本次实验所用到的软硬件平台如下:
1、VIVADO 2019.1
2、Modelsim 10.7
举例说明
其实阻塞逻辑赋值与非阻塞逻辑赋值最明显的区别就是:是否在整个代码块执行完毕再更新代码块中的数值。对于阻塞赋值 ‘=’被赋值的变量立刻发生变化,非阻塞逻辑赋值‘<=’会等到整个代码块运行结束后再进行变量的更新。接下来将以一道题目来解释于阻塞赋值 ‘=’出现在时序逻辑中的例子。
题目要求: 将一个串行执行的C语言算法转化为单拍完成的并行可综合verilog。
C语言源码如下:
unsigned charcal_table_high_first(unsignedcharvalue)
{
unsigned char i ;
unsigned char checksum = value ;
for (i=8;i>0;--i)
{
if (check_sum& 0x80)
{
check_sum = (check_sum<<1) ^ 0x31;
}
else
{
check_sum = (check_sum << 1);
}
}
return check_sum;
}
针对上面的函数输入相应的变量检测我们接下来代码实现的正确性:
value =0x0:check_sum=0x0
value =0x1:check_sum=0x31
value =0x2:check_sum=0x62
value =0x3:check_sum=0x53
value =0x4:check_sum=0xc4
value =0x5:check_sum=0xf5
value =0x6:check_sum=0xa6
value =0x7:check_sum=0x97
value =0x8:check_sum=0xb9
value =0x9:check_sum=0x88
value =0xa:check_sum=0xdb
value =0xb:check_sum=0xea
value =0xc:check_sum=0x7d
这里可以看出题意上的要求是单拍完成,这个题很想CRC校验的问题,整个CRC校验每个字节的输入也必须再单拍内完成,还记得当时的博客我们咋么进行实验的吗,就是将每一位输出表达式进行彻底展开,然后在一拍之后输出,不太明白的同学,可以查看这篇博客基于FPGA的千兆以太网的实现(3),但是在进行输出展开的时候特别耗费时间,而且还有可能出错,那么有没有更好的办法进行计算呢?接下来我们将充分利用组合逻辑来实现这题目。
在进行写代码时,首先进行以下分析:
该算法逻辑如下:输入一个8bit的数,首先判断最高位是否为1,如果为1则左移一位,并且和8‘b0011