我是靠谱客的博主 高贵季节,最近开发中收集的这篇文章主要介绍Verilog实现二进制码与格雷码转换,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

格雷码是一种常见的编码方式,相邻状态间只有一位不同;这就意味着相邻两个状态间进行转换时,只有一位发生变化,因而极大的减小了出错几率。(反之,如果使用二进制编码,如011->100时三位均发生改变,因此出错的机率就会大大增加)。格雷码以及其余常见编码的知识详见:

Verilog常见编码方式:二进制码、格雷码、独热码

如上所述,格雷码作为一种错误最小化的编码方式,常用于状态机等多种场合。二进制与格雷码相互转换的问题也很可能遇到,此处就针对这一问题进行分析与仿真。

目录

一、格雷码与二进制码

二、二进制与格雷码的转换

三、仿真验证

四、参考文献:


一、格雷码与二进制码

以3位二进制码和格雷码作为示例,演示两者的编码方式以及相互关系:

二进制-格雷码对照表
编号二进制格雷码
0000000
1001001
2010011
3011010
4100110
5101111
6110101
7111100

二、二进制与格雷码的转换

1、二进制码->格雷码
      方式1:从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变(相当于左边是0);
    (Verilog中利用右移与亦或,可以方便的实现二进制到格雷码的转换)

      方式2:直接使用条件判断语句如:case语句

 2、格雷码->二进制码
      方式1:从左边第二位起,将每位与左边一位解码后的值异或,作为该位解码后的值(最左边一位依然不变)。
   (如何用Verilog实现?转换结果与已转换位的解码值有关,因此难以像二级制-格雷码转换时一步得到。只能通过循环,历经好几个时钟周期才能转换结束)

      方式2:直接使用条件判断语句如:case语句

三、仿真验证

以三位二进制码转换为格雷码为例,进行仿真验证如下:

实现代码如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2020/03/17 20:14:40
// Design Name: 
// Module Name: bin2gray
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


//module bin2gray(
//input clk,
//input rst_n,
//input [2:0]bin,
//output reg [2:0]gout
//    );
 mid_signal declaration
//reg [2:0]ls_bin;
 function declaration
//always@(posedge clk or negedge rst_n)
//begin
//    if(!rst_n)
//        begin
//            gout <= 3'b000;
//            ls_bin <= 3'b000;
//        end
//    else
//        begin
//            ls_bin <= bin >> 1; 
//            gout <= ls_bin ^ bin;
//        end
//end 
//endmodule
module bin2gray(
input rst_n,
input [2:0]bin,
output reg [2:0]gout
    );
// mid_signal declaration
reg [2:0]ls_bin;
// function declaration
always@(*)
begin
    if(!rst_n)
        begin
            gout = 3'b000;
            ls_bin = 3'b000;
        end
    else
        begin
            ls_bin = bin >> 1; 
            gout = ls_bin ^ bin;
        end
end 
endmodule

测试文件如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2020/03/17 20:25:27
// Design Name: 
// Module Name: bin_gray_tsb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module bin_gray_tsb(

    );
// port declaration
//reg clk;
reg rst_n;
reg [2:0]bin;
wire [2:0]gout;
 clk
//initial
//begin
//    clk = 0;
//    forever #10 clk = ~clk;
//end
// signal
initial
begin
    rst_n = 1;
    bin = 3'b000;
    #15 rst_n = 0;
    #20 rst_n = 1;
    #20 bin = 3'b001;
    #20 bin = 3'b010;
    #20 bin = 3'b011;
    #20 bin = 3'b100;
    #20 bin = 3'b101;
    #20 bin = 3'b110;
    #20 bin = 3'b111;
end
// instance
bin2gray mb2g(
//    .clk(clk),
    .rst_n(rst_n),
    .bin(bin),
    .gout(gout)
);
endmodule

仿真结果如下:

RTL电路如下:

发现,时序逻辑写法反而没有组合逻辑写法方便;

四、参考文献:

Verilog常见编码方式:二进制码、格雷码、独热码

最后

以上就是高贵季节为你收集整理的Verilog实现二进制码与格雷码转换的全部内容,希望文章能够帮你解决Verilog实现二进制码与格雷码转换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(76)

评论列表共有 0 条评论

立即
投稿
返回
顶部