孩子都能学会的FPGA:第二十三课——用FPGA实现格雷码的编码和解码

(原创声明:该文是作者的原创,面向对象是FPGA入门者,后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门作者不光让大家知其然,还要让大家知其所以然!每个工程作者都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真(前提是安装了modelsim),降低了初学者的门槛。如需整个工程请留言(WX:Blue23Light),不收任何费用,但是仅供参考,不建议大家获得资料后从事一些商业活动!

前面几课有说过不同时钟域的同步,有一课也讲过基于握手机制的跨时钟域同步机制,今天就谈谈采用格雷码编码和解码,将数据格雷码编码后再跨时钟传输,可以很好的进行同步,至于原因,那就是格雷码的数据无论如何加减变化,相邻的两个数最多只有一位数据在变化,就是跨时钟的时候把变化降到了最低,对于一位数据的同步,我们又可以采用打拍的方式进行同步!所以对于多位连续变化(递增或者递减)的数据的跨时钟同步,格雷码的编解码是一个不错的选择。

至于格雷码编码后数据的同步,我们可以用一个非常简单的例子来说明。比如10个人约定好赶早晨8点的那趟地铁,这10个人都是分散的,每个人的时间观念也不同,所以这10个人有可能都都赶上,也有可能一部分人能赶上,一部分人赶不上,或者10个人都赶不上。现在更改一下规则,要求10个人前天在宾馆住下,定好闹钟,早晨10个人一块出发赶8点的地铁,这样的花10个人就是一个整体了,那不全部都赶上,要不全部都赶不上,不会出现部分赶上,部分赶不上的情况了。当然这个例子可能不太合适,只能反应大体的意思,可能这个例子用在异步缓存上更合适一些。

我们先对比一下二进制数据和格雷码编码后的数据,如下所示。二者的是有一定的对应关系的,这个需要数字电路的一些知识,如何得到关系式不是本文介绍的重点。

先说结论,二进制数转格雷码的公式如下所示,就是格雷码最高位和二进制数一样,格雷码其它位是二进制的当前位和上一位的异或取值。

下图给出了二进制数转格雷码的示意图。

格雷码转二进制数的公式如下所示,二进制的高位和格雷码的高位一样,二进制的其它位是格雷码从最高位到当前所有位的亦或值。

下图给出了格雷码装二进制数的示意图。

有了公式,也有了示意图,那格雷码的编解码的FPGA实现就非常简单了。我们首先看格雷码的编码模块,以8位数据为例,如下所示,用组合逻辑实现即可,不消耗时钟周期。当然有更简单的编码方式,就如公式一样,先将gray_in右移一位,再和gray_in异或即可。

格雷码的解码FPGA实现也非常简单,如下所示。

新建仿真文件生成递增数,双击sim目录下的top_tb.bat文件,如下所示。

仿真结果如下所示,我们先将递增数gray_encode_in编码成格雷码gray_encode_out,然后再解码成gray_decode_out,看模拟的图形,格雷码还是非常漂亮的。

有了格雷码编解码,那我们就可以做更多的事情了,比如将异步RAM封装成异步的FIFO,后续我们会具体的讲解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值