0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

异步FIFO设计之格雷码

ruikundianzi 来源:IC的世界 2023-11-01 17:37 次阅读

相邻的格雷码只有1bit的差异,因此格雷码常常用于异步fifo设计中,保证afifo的读地址(或写地址)被写时钟(或读时钟)采样时最多只有1bit发生跳变。

在不考虑路径延时的情况下,因为源数据(读写地址)只有1bit变化,即使发生了亚稳态,最终的结果相当于被目的时钟延迟一拍采样。

需要注意的是:异步fifo中使用格雷码无法避免亚稳态,它起到的作用是,即使发生了亚稳态,依旧能够保证异步fifo的功能正确

10进制 二进制 格雷码
0 000 000
1 001 001
2 010 011
3 011 010
4 100 110
5 101 111
6 110 101
7 111 100

1.二进制转格雷码



47432c84-7898-11ee-939d-92fbcf53809c.png 图1:二进制转格雷码

如图所示,二进制转格雷码实现简单,二进制数据右移1bit,高位补零后与自身进行位异或得到格雷码。代码实现如下:waddr为二进制写地址,waddr_gray为对应的写地址格雷码

assign waddr_gray[ADDR_WDTH:0]=waddr[ADDR_WDTH:0] ^ {1’b0,waddr[ADDR_WDTH:1] }; 

2.格雷码转二进制




4761a06a-7898-11ee-939d-92fbcf53809c.png

图2:格雷码转2进制 首先需要强调一下异或操作的特点:

A、B、C为1bit二进制整数,假设等式为A^B==C,那么已知B和C的情况下,可以通过A==B^C求得A数值。此处可以使用穷举法尝试一下,只有4种情况。




从二进制转格雷码也可以反推出格雷码转二进制的思路。

首先:最高bit位是相等的,b7等于g7。

因为g6==b7^b6,根据异或特性(由A^B==C得到A==B^C),可得知b6=b7^g6,即b6=g7^g6

因为g5==b5^b6,根据异或特性,可得知b5=g5^b6,即b5=g5^g6^g7

依次类推:b0=g0^g1^g2^g3^g4^g6^g7



在如下Verilog代码实现中,我们提供了3种写法。
写法1和写法2都是已知确定位宽的情况下,实现格雷码转二进制码,不利于参数化。

写法3采用function函数实现,不限制位宽,支持参数化。

//写法 1


assign bin_code[0]=gray_code[0]^gray_code[1]^gray_code[2]^gray_code[3] ;
assign bin_code[1]=gray_code[1]^gray_code[2]^gray_code[3] ;
assign bin_code[2]=gray_code[2]^gray_code[3] ;
assign bin_code[3]=gray_code[3] ;




//写法2
assign bin_code = {gray_code[3], ^gray_code[3:2], ^gray_code[3:1], ^gray_code};






//写法3:
function       [ADDR_WIDTH:0]   bin_out;    
   input       [ADDR_WIDTH:0]   gray_in;    
   reg         [ADDR_WIDTH:0]   gray_code;  
   reg         [ADDR_WIDTH:0]   bin_code;   
   integer i,j;                             
   reg tmp;                                 
   begin
       gray_code = gray_in;
       for(i=0;i<=ADDR_WIDTH;i=i+1)
           begin
           tmp=1'b0;
           for(j=i;j<=ADDR_WIDTH;j=j+1)
              tmp=gray_code[j]^tmp;
           bin_code[i]=tmp;
           end
       bin_out= bin_code;
   end
endfunction 

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • fifo
    +关注

    关注

    3

    文章

    387

    浏览量

    43548
  • 格雷码
    +关注

    关注

    2

    文章

    34

    浏览量

    13175
  • 异步FIFO
    +关注

    关注

    0

    文章

    20

    浏览量

    8351
  • FIFO设计
    +关注

    关注

    0

    文章

    7

    浏览量

    4962

原文标题:

文章出处:【微信号:IP与SoC设计,微信公众号:IP与SoC设计】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是

    (Gray code),又叫循环二进制或反射二进制 在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,
    发表于 11-11 09:34 7296次阅读
    什么是<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>

    简介及格与二进制的转换程序

    简介及格与二进制的转换程序
    发表于 04-22 09:00

    什么是BCD、8421、余三

    的是8421BCD,无权用得较多的是余三,我们通常所说的BCD
    发表于 11-03 17:36

    介绍

    介绍
    发表于 08-14 09:44

    详细讨论异步FIFO的具体实现???

    我在网上看到一篇利用来设计异步FIFO,但是看他们写的一些源码,小弟有些不是很理解,在设计时为什么会出现Waddr和wptr两个关于写
    发表于 05-19 11:04

    的规则和应用问题?

    今天看到一个计数的程序,搜了下定义,觉得还是云里雾里,定义写的是若任意两个相邻的代码只有一位二进制数不同,则这种编码为
    发表于 08-20 14:41

    异步FIFO的VHDL设计

    给出了一个利用对地址编码的羿步FIFO 的实现方法,并给出了VHDL 程序,以解决异步读写时钟引起的问题。
    发表于 07-16 15:15 26次下载

    简介及格与二进制的转换程序

    简介及格与二进制的转换程序
    发表于 01-16 11:52 5003次阅读

    运算研究

    运算研究 在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,是一
    发表于 03-18 14:07 1449次阅读

    循环VHDL源程序

    我们知道计数的特点就是相邻的码字只有一个比特不同,那么我们在设计计数时找到这个比特取
    发表于 11-11 09:32 2097次阅读

    辨析

    讨论了Gray Code 的由来,剖析了关于的一些不合理说法,明确了其正宗的发明者应该是弗兰克·,正确的英文名称是Gray Cod
    发表于 11-28 16:04 5605次阅读
    <b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>辨析

    编码规则_有什么规律

    典型的二进制简称,因1953年公开的弗兰克·
    的头像 发表于 03-02 14:29 5.5w次阅读
    <b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>编码规则_<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>有什么规律

    如何把二进制转换为是如何判断读空写满呢?

    在传递读写时钟域的指针使用来传递,如何把二进制转换为
    的头像 发表于 09-15 09:38 8285次阅读
    如何把二进制转换为<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>?<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>是如何判断读空写满呢?

    异步FIFO的原因有哪些

    异步FIFO通过比较读写地址进行满空判断,但是读写地址属于不同的时钟域,所以在比较之前需要先将读写地址进行同步处理,将写地址同步到读时钟域再和读地址比较进行FIFO空状态判断(同步后的写地址一定
    的头像 发表于 08-04 14:05 4399次阅读

    异步FIFO-

    很多人在面试时被问到为什么异步FIFO中需要用到,可能大部分的答案是
    的头像 发表于 08-26 14:20 967次阅读
    <b class='flag-5'>异步</b><b class='flag-5'>FIFO</b>-<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>码</b>