前言,FPGA是机器视觉里面经常用的的控制逻辑单元,并行处理速度快。

格雷码的生成方法中,通过异或的逻辑变化生成格雷码是最适合的方式。


举例一个位元为3的格雷码:

下面为一个位元为4的格雷码对比图

1 软件一般用递归法:

2 异或的方法:

2.1 标准的异或移位法:

前面几节我们讲过这个方法,小结一下:其实就是错位异或

2.2 异或乘除法:

2.2.1 编码:异或乘3后右移1位。

2.2.2 解码


3 FPGA源码:

3.1 实现模组代码

说明:pDataWidth 设定位元长度。

3.1.1 二进制到格雷码

//================================================================
//  Filename      : bin2gray.v
//  Created On    : 2017-05-14 16:54:30
//  Last Modified : 2017-05-14 16:55:14
//  Author        : ChrisHuang
//  Description   : Converting Gray Code to Binary
//================================================================`timescale 1ns/1psmodule bin2gray
#(parameter pDataWidth = 4
)
(input [pDataWidth-1:0] iBinary,output [pDataWidth-1:0] oGrayCode
);assign oGrayCode = (iBinary >> 1) ^ iBinary;endmodule

3.2 仿真模拟的代码:

这里模拟要用到FPGA的模拟工具 ModelSim,详细请参考附件:

这里我们参考Chris写的一段:tb = testbench的代码

//================================================================
//  Filename      : bin2gray_tb.v
//  Created On    : 2017-05-14 16:54:30
//  Last Modified : 2017-05-14 16:55:14
//  Author        : ChrisHuang
//  Description   : test Converting Gray Code to Binary
//================================================================`timescale 1ns/1psmodule bin2gray_tb();reg rClk;
reg [3:0] rBinary;
wire [3:0] wGray;initial
beginrClk = 0;rBinary = 4'b0;#500 $stop;
endalways #10 rClk = ~rClk;always @ (posedge rClk)
beginrBinary  <= rBinary + 1'b1;
endbin2gray #(4) i1
(.iBinary       (rBinary    ),.oGrayCode    (wGray  )
);endmodule

写到ModelSim里面,仿真的时候,前面的模组代码也要加上。

1 compile/compile all

# Compile of GrayCode.v was successful.

2 simulate

为了simulate成功,需要把所有的模组都编译出来。放到一个文件里面编译方便一点:


//================================================================
//  Filename      : bin2gray_tb.v
//  Created On    : 2017-05-14 16:54:30
//  Last Modified : 2017-05-14 16:55:14
//  Author        : ChrisHuang
//  Description   : test Converting Gray Code to Binary
//================================================================`timescale 1ns/1ps
module bin2gray
#(parameter pDataWidth = 4
)
(input [pDataWidth-1:0] iBinary,output [pDataWidth-1:0] oGrayCode
);assign oGrayCode = (iBinary >> 1) ^ iBinary;endmodulemodule gray2bin
#(parameter pDataWidth = 4
)
(input [pDataWidth-1:0] iGrayCode,output [pDataWidth-1:0] oBinary
);reg [pDataWidth-1:0] rBinary;always @ (iGrayCode)
beginrBinary[3] = iGrayCode[3];rBinary[2] = iGrayCode[2] ^ rBinary[3];rBinary[1] = iGrayCode[1] ^ rBinary[2];rBinary[0] = iGrayCode[0] ^ rBinary[1];
endassign oBinary = rBinary;endmodulemodule bin2gray_tb();reg rClk;
reg [3:0] rBinary;
wire [3:0] wGray;initial
beginrClk = 0;rBinary = 4'b0;#500 $stop;
endalways #10 rClk = ~rClk;always @ (posedge rClk)
beginrBinary  <= rBinary + 1'b1;
endbin2gray #(4) i1
(.iBinary       (rBinary    ),.oGrayCode    (wGray  )
);endmodule

右键,compile -> compile all,编译一下,

编译后,会有3个模组,我们找_tb这个做仿真;

右键,选择simulate

这时候,出现了准备好的端口,

我们要比较二进制和格雷码,那么吧时钟,和4个码位的端口都选好。(选的时候,按住Ctrl键)

然后,右键,选择 add to  (不是 add wave)\ wave \selected signals

弹出模拟仿真波形框

选一个周期5ms,在选择run,

按住ctrl + 鼠标可以变更周期,进行波形探查。

我们再比对一下,格雷码产生波形的正确性。

红色箭头为每个输出的字码周期的4位的数字,我们看到,前面3位的变化是符合格雷码的定义的。


参考:

1 格雷码的FPGA实现_ChrisHuang的博客-CSDN博客

2 FPGA攻略之Testbench篇 (eepw.com.cn)

3 Modelsim超级详细教程 手把手教一看就会 (Modelsim10.0 FPGA仿真软件 )_从零开始学单片机的博客-CSDN博客

4 格雷码原理与Verilog实现 - logic3 - 博客园 (cnblogs.com)

5 【原创】二进制码转格雷码互转换的FPGA设计-crazybird-电子技术应用-AET-中国科技核心期刊-最丰富的电子设计资源平台 (chinaaet.com)

6 verilog实现二进制和格雷码互转_搞FPGA的吕小春_新浪博客 (sina.com.cn)

3D 机器视觉 02 - FPGA生成N位元格雷码相关推荐

  1. Java 生成13位条形码 Ean-13码规则:第十三位数字是前十二位数字经过计算得到的校验码。

    package cn.zhang;import java.util.Scanner;public class Subject001 {/**生成13位条形码 Ean-13码规则:第十三位数字是前十二位 ...

  2. 每日练习------生成13位条形, Ean-13码规则:第十三位数字是前十二位数字经过计算得到的校验码。

    题目: 生成13位条形码 Ean-13码规则:第十三位数字是前十二位数字经过计算得到的校验码. 例如:690123456789 计算其校验码的过程为: @前十二位的奇数位和6+0+2+4+6+8=26 ...

  3. 生成13位条形码 Ean-13码规则: 第十三位数字是前十二位数字经过计算得到的校验码。

    public static void main(String[] args) {/** 生成13位条形码 Ean-13码规则: 第十三位数字是前十二位数字经过计算得到的校验码. 例如:69012345 ...

  4. (132)FPGA面试题-Verilog实现格雷码转二进制

    1.1 FPGA面试题-Verilog实现格雷码转二进制 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA面试题-Verilog实现格雷码转二进制: 5)结束语. ...

  5. # 生成单色位二维码图_如何2个小时内学会ps抠图-纯干货

    本人计划5个月成为设计师,现在从小白开始学起,每周会贴出学习内容总结,喜欢我分享的朋友可以关注我,进行交流哦. 今天花了两个小时学习了最常用的ps抠图流程以及工具使用. 学习前:ps界面每个工具乱点乱 ...

  6. 根据时间戳生成6位唯一邀请码

    原文:https://blog.csdn.net/u012954706/article/details/84033576 import java.util.Random; /*** 邀请码生成器,算法 ...

  7. java 递归生成格雷码_格雷码的递归生成

    问题:产生n位元的全部格雷码.html 格雷码(Gray Code)是一个数列集合,每一个数使用二进位来表示,假设使用n位元来表示每一个数字,任两个数之间只有一个位元值不一样. 例如如下为3位元的格雷 ...

  8. 4位格雷码的顺序编码_格雷码那点事——递归非递归实现

    简介 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即"首尾相连",因此又称循环 ...

  9. 腾讯---生成格雷码

    腾讯-生成格雷码 文章目录 腾讯---生成格雷码 一.题目描述 二.分析 三.代码 一.题目描述 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code ...

最新文章

  1. (转)jQuery禁止右键菜单,全选
  2. tableau必知必会之拖拽功能失效是怎么回事
  3. 远离极限编程 (Don’t do XP)
  4. Web APi之EntityFramework【CRUD】(三)
  5. oracle描述dept,一些关于oracle驱动表的描述
  6. 是引进外部函数吗_使用PowerBI的这两个函数,灵活计算各种占比
  7. cocos2dx-3.2 运行第一个android程序
  8. Python 之 sorted()排序详解 适用于任意可迭代对象比如列表,字典等
  9. php android 图片上传,android上传图片到PHP的过程详解
  10. Servlet和JSP的异同。
  11. GoF的23种设计模式分类概念
  12. arcgis python计算面积_如何在ARCMAP里面计算面积
  13. 原来找展会会刊(参展商名录)这么简单
  14. c语言身高和标准体重,c语言4-15 输出标准身高体重对照表
  15. 中国黑客生存特写,互联网金钱帝国里的英雄和盗匪
  16. 日拱一卒,集小胜为大胜; 学以致用,在战争中学习战争;
  17. 计算机专业英语听说,计算机专业英语听说(二).doc
  18. Java Shadowing 影子变量 影子声明
  19. 京东JOS API 接入使用笔记
  20. online python compiler_在线控制台编译器:Online Console Compiler

热门文章

  1. 【Day01】你有封装过 axios 吗?主要是封装哪些方面?如何中断 axios 请求?
  2. 【JavaScript】提取字符串里的分数,及计算平均分并与平均分比较输出
  3. 【Python】Python库之虚拟现实
  4. 【C语言】两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单,a说他不和x比,c说他不和x,z比,编写程序找出三对赛手名单。...
  5. C do...while 循环
  6. 给自己的网站添加复制提示代码
  7. 使用heroku托管服务搭建网站
  8. sqlachemy入门基础手册
  9. 原型制作是什么意思_制作电路原型的最佳方法是什么?
  10. svn差异查看器 编码_男女学习编码的9个差异