我的 FPGA 学习历程(06)—— 二进制转格雷码

格雷码是一种无权编码,其特点是相邻的两数之间只有一个位不同,像这样:

        000-->001-->011-->010-->110-->111-->101-->100

对比二进制码是这样的:

        000-->001-->010-->011-->100-->101-->110-->111

       从格雷码的定义可以看到格雷码的顺序显然不是唯一的。虽然格雷码独特的编码方式使得它不便于阅读,但它的优点在于对比使用二进制编码的逻辑电路,比如像从 011 变到 100 的这个过程,在这种存在多个二进制位并行变化的情况下,由于电路本身的物理结构限制,导致变化存在先后顺序而不是同时的,短暂的时间差会产生一些非预想的中间状态比如 111,110,那么当这些中间状态被其他器件探测到时候就可能会引发错误。

书中讲到一种格雷码转化的方法

假设要把二进制串 b[i] (i=n-1, n-2, ..., 1, 0) 转换为格雷码串 g[i] (i=n-1, n-2, ..., 1, 0)
有以下方法:    
     1.  保留最高位 g[i] = b[i] (i = n-1) 
     2.  把其余各位 g[i] = b[i+1] ^ b[i] (i = n-2, n-3, ..., 1, 0)

对于 n = 3 的格雷码,具体转化步骤如下:
格雷码

对于有限位数的具体的算法总是很容易被仿真工具检验的,但若想完全证明它就非常困难了。我认为对于算法这种东西,不必深究其原理,只学要会如何使用就足够了。

这里有一个通用的格雷码转化器,可以把 N 位的二进制码转化为相应的特定格式的格雷码,代码如下,各位可以试试。

module bin2gray
(
    input wire b[N-1:0],
    output reg g[N:0]
);

//****************************//
    parmater N = 3;    //这里设为 3 位的格雷码转化器
//****************************//
    assign g[N-1]   = b[N-1];
    assign g[N-2:0] = b[N-2:1] ^ b[N-3:0];
//***************************//

endmodule

转载于:https://www.cnblogs.com/SummerSunnyDay/p/4990670.html

要实现FPGA上的二进制BCD码功能,可以按照以下步骤进行: 1. 首先,需要设计一个模块接收输入的11位有符号二进制数。可以使用一个11位的寄存器来存储输入数据,并通过一个有效信号(bin_vld)来控制数据的输入。 2. 接下来,需要将输入的二进制数进行符号扩展,将其扩展为17位的有符号数。可以使用一个6位的符号扩展模块来实现,将输入的11位二进制数的最高位复制到扩展后的17位数的高位。 3. 然后,使用一个BCD编码器将扩展后的17位有符号数换为BCD码。BCD编码器可以使用查找表或者组合逻辑电路来实现,将每个4位二进制数映射到对应的BCD码。 4. 最后,输出换好的BCD码数据并同步输出有效信号(bcd_vld)。可以使用一个寄存器来存储换后的BCD码,并通过一个输出有效信号来控制数据的输出。 这样就可以实现FPGA上的二进制BCD码功能了。根据具体的需求和性能要求,可以进行相应的优化和调整。<span class="em">1</span> #### 引用[.reference_title] - *1* [FPGA实现二进制到BCD码换](https://blog.csdn.net/weixin_45451974/article/details/129917059)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值