【芯片设计】格雷码与二进制转化代码的四次进阶之路
发布网友
发布时间:2024-10-17 09:10
我来回答
共1个回答
热心网友
时间:2024-11-03 22:33
前三次进阶发生在5年前,而第四次则是在3周前。格雷码在异步fifo的同步化设计中扮演着关键角色,而二进制与格雷码之间的转换代码也相对简单。然而,几次进阶的经历却颇具趣味。以下是4比特二进制与格雷码的对照关系:
二进制转格雷码的转换关系在各类资料中都有所阐述。简单来说,二进制最高位为格雷码最高位,二进制最高位与次高位相异或得到格雷码次高位,以此类推。格雷码转二进制时,二进制最高位为格雷码最高位,二进制最高位与格雷码次高位相异或得到二进制次高位,以此类推。
以下是第一次代码的实现。为了8位输入输出设计,二进制转格雷码的代码如下:
当时使用modelsim进行仿真:
格雷码转二进制的代码如下:
波形如下:
从波形中可以看出,结果是正确的。实际上,在转换模块中一般不需要进行打拍,而是在外部进行即可。
然而,后来我意识到这种设计在处理大于8位或任意位输入时会出现问题,不具有通用性。因此,我采用for循环进行了第二版代码的编写。以下为任意小于32位宽输入输出的二进制转格雷码代码:
波形如下:
格雷码转二进制代码如下:
波形如下:
在这一阶段,我已经掌握了for循环的语法,因此写完这一版代码后非常满意,觉得verilog也不过如此。
然而,后来我查阅了书籍,发现书上的写法与自己的有所不同,这让我意识到自己的差距。二进制转格雷码的代码如下:
格雷码转二进制代码如下:
从图中可以看出,二进制转格雷码是将二进制错位下,然后按位异或;格雷码转二进制则是将当前位(包括第k位)以前的所有格雷码按位异或。
几周前,我重新编写了异步fifo的代码。这时,我意识到格雷码转二进制的代码可以进一步简化。
除了最高比特外,二进制输出的每一比特都是由格雷码的对应比特和二进制的上一比特做异或得到的。因此,可以简化为如下写法:
这种写法可能会引起组合逻辑环的误会,但实际上并不会形成逻辑环,因为每个比特都没有与自身形成组合逻辑。同样的写法在写RR调度等模块里找“首一”时也会用到。
以WD=4为例,这句代码的实际拆解如下:
这种写法大同小异,习惯就好。经过四次代码进阶,我完成了整个过程。