首页 > 其他分享 >verilog实现格雷码和二进制码的相互转换

verilog实现格雷码和二进制码的相互转换

时间:2024-06-20 10:58:12浏览次数:23  
标签:bin 格雷 二进制码 Bn grey verilog logic

目录

格雷码的介绍

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。
在数字系统中,常要求代码按一定顺序变化。例如,按自然数递增计数,若采用8421码,则数0111变到1000时四位均要变化,而在实际电路中,4位的变化不可能绝对同时发生,则计数中可能出现短暂的其它代码(1100、1111等)。在特定情况下可能导致电路状态错误或输入错误。使用格雷码可以避免这种错误。

二进制码转化为格雷码

二进制码转换成二进制格雷码,其法则是保留二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。
假设有n位二进制数:

n位二进制数 Bn-1 Bn-2 Bn-3 ... B1 B0

其转化位相应n位格雷码的转化法则为:

n位格雷码 Gn-1 Gn-2 Gn-3 ... G1 G0
转化规则 Bn-1 Bn-1^Bn-2 Bn-2^Bn-3 ... B2^B1 B1^B0

verilog中,假设有 logic [n-1:0] bin; logic [n-1:0] grey;

则有:

bin Bn-1 Bn-2 Bn-3 ... B1 B0
bin>>1 0 Bn-1 Bn-2 Bn-3 ... B1
grey Bn-1^0 Bn-1^Bn-2 Bn-2^Bn-3 ... B2^B1 B1^B0
grey Bn-1 Bn-1^Bn-2 Bn-2^Bn-3 ... B2^B1 B1^B0

因为Bn-1^0=Bn-1,所以在verilog中,我们可以用下面的几行代码,得到二进制编码到格雷码的转化:

logic [n-1:0] bin; 
logic [n-1:0] grey
assign grey = bin ^ (bin>>1);

格雷码转化为二进制码

从前面二进制码转化为格雷码法则,我们知道
Gn-i=Bn-i+1^Bn-i
则有
Bn-i+1^Gn-i = Bn-i+1 ^ Bn-i+1 ^ Bn-i
Bn-i+1 ^ Gn-i = 0 ^ Bn-i-1= Bn-i

所以格雷码转化为二进制码的规则为:

n位二进制 Bn-1 Bn-2 Bn-3 ... B1 B0
转化规则 Gn-1 Gn-2^Bn-1 Gn-3^Bn-2 ... G1^B2 B0^B1

在verilog中我们可以用一个generate块内循环实现转换

//从次高位到0,二进制的高位和次高位格雷码相异或
genvar i;
generate
	for(i = 0; i <= DATA_WIDTH-2; i = i + 1) 
		begin:
			assign bin[i] = bin[i + 1] ^ grey[i];
		end
endgenerate

verilog实现代码

文件名称:code4_41.v

`timescale 1ns/1ps	

module grey_tb;
 
	logic clk=0;

	always #5 clk = ~clk;

	initial begin

    	$display("start a clock pulse");
    	$dumpfile("grey.vcd"); 
    	$dumpvars(0, grey_tb); 
   		#300 $finish;
	end

	logic [7:0] bin;
	logic [7:0] grey;
	logic [7:0] bin2;

	logic [7:0] bin_1=0;
	logic [7:0] grey_1;
	logic [7:0] bin2_1;

	initial begin

// 重复执行10次随机数生成过程
		repeat(10) begin 
			@(posedge clk) begin

			bin <= $random();

			end
		end
// 重复执行32次的循环,用于对bin_1进行自增操作
		repeat(32) begin 
			@(posedge clk) begin

			bin_1 <= bin_1+1;

			end
		end

	end

	bin2grey #(.DATA_WIDTH(8)) bin2grey_inst(.bin(bin),.grey(grey));
	grey2bin #(.DATA_WIDTH(8)) grey2bin_inst(.grey(grey),.bin(bin2));

	bin2grey #(.DATA_WIDTH(8)) bin2grey_inst1(.bin(bin_1),.grey(grey_1));
	grey2bin #(.DATA_WIDTH(8)) grey2bin_inst1(.grey(grey_1),.bin(bin2_1));

endmodule


//二进制转格雷码
module	bin2grey
#(
	parameter DATA_WIDTH=8
)
(
	input wire [DATA_WIDTH-1:0] bin,

	output logic [DATA_WIDTH-1:0] grey

);                                                              
 
	assign grey = bin ^(bin>>1);
 
endmodule

//格雷码转二进制码
module grey2bin
#(
	parameter DATA_WIDTH=8
)
(
	input wire [DATA_WIDTH-1:0] grey,

	output logic [DATA_WIDTH-1:0] bin

);                                                              
 
	assign bin[DATA_WIDTH-1] = grey[DATA_WIDTH-1];

genvar i;
generate
	for(i=DATA_WIDTH-2;i>=0;i=i-1) begin
		assign bin[i] = bin[i+1] ^ grey[i];
	end
endgenerate

 
endmodule

在vscode中执行以下命令,编译code,打开波形文件:

iverilog -o myrun -g 2012  code4_42.v
vvp myrun
gtkwave grey.vcd

image

可以看到二进制码先转化为格雷码,再转回二进制码,得到期望的值。而且相邻数的格雷码确实是只差1位数。

标签:bin,格雷,二进制码,Bn,grey,verilog,logic
From: https://www.cnblogs.com/Hutuerdan/p/18248979

相关文章

  • verilog 设计与综合实验报告(5)
    题目5:序列检测器1、设计方案2、程序代码modulesequential5_detector(inputi_clk, inputi_rst, inputi_seq, outputregout);parameteridle=5'b00000,s1=5'b00001,s2=5'b00010,s3=5'b00100,......
  • Verilog Hdl 计数器分频
    “分频”:是累加多个输入时钟信号clk_in的周期,最终使得,输出时钟信号clk_out的周期变大,频率变小。一、偶数分频例:计数器要实现6分频,输入时钟信号clk_in的6个周期要变成1个周期输出,输出6分频的输出时钟信号clk_out的半个周期占3个输入时钟信号clk_in的周期,相当于clk_out每次在3......
  • ncverilog与finesim联合进行混合仿真的详细过程(以spice为顶层)
    第一步:Makefile仿真命令one:ncverilog+access+rwc+nc64bit+loadvpi=finesim.so:finesim_startup-frun.f第二步:环境结构(1)以模拟为顶层,顾名思义是把CDL网表中某一个模块替换为数字的function,其余全是CDL,以上图为例,把其中inv替换为数字的function。(2)需要文件:testben......
  • 用verilog/systemverilog 设计fifo (1)
    目录fifo的基本原理基于计数器的同步fifo实现(1)基于计数器的同步fifo实现(2)基于高位补偿法的fifo实现fifo的基本原理FIFO(firstinfirstout),即先进先出存储器,功能与数据结构中的队列相似。在IC设计中,FIFO常用来缓冲突发数据,流式数据与块数据的转换等等。比如上图中,在两个......
  • 串口收发UART(Verilog HDL)
    UART(UniversalAsynchronousReceiverTransmitter,通用异步收发器)是一种异步串行通信协议,主要用于计算机和嵌入式系统之间的数据交换。实现UART通信的接口规范和总线标准包括RS-232、RS449、RS423和RS485等,接口标准规定了通信标准的电气特性、传输速率、连接特性和机械特性。文......
  • Case专题--->(28)verilog 优先Case(四)
     (28)verilog优先Case(四)1目录(a)IC简介(b)vim简介(c)Verilog简介(d)verilog优先Case(四)(e)结束1IC简介(a)在IC设计中,设计师使用电路设计工具(如EDA软件)来设计和模拟各种电路,例如逻辑电路、模拟电路、数字信号处理电路等。然后,根据设计电路的规格要求,进行布局设计和布线,确定各......
  • 搭建verilog/systemverilog学习环境
    目录仿真软件选择使用iverilog的基本步骤仿真软件选择学习verilog或者systemverilog过程中,使用那种仿真软件?当然最好是使用synopsys的vcs+verdi的组合,功能强大,而且大部分公司也使用synopsys的eda软件,如果熟练掌握vcs+verdi对以后工作中使用它们也是有很大帮助。但是这两个软件......
  • SystemC & TLM-2.0 - SystemC vs SystemVerilog
    WhatisthedifferencebetweenSystemCandSystemVerilogSystemCisusedprimarilyasamodelinglanguageparticularlyforvirtualplatformmodelingwhereassystemverilogisusedmainly50chableHardwareverification.I'mgoingtodivedowninto......
  • Emacs Verilog Mode 简单使用指南
    引言在硬件描述语言(HDL)中,Verilog是一种广泛使用的语言,用于设计和描述数字电路。为了提高Verilog代码编写的效率和准确性,许多开发者选择使用Emacs作为他们的集成开发环境(IDE)。Emacs是一个高度可定制的文本编辑器,拥有丰富的插件生态系统,其中VerilogMode是专为Veril......
  • 基于FPGA的图像直方图均衡化处理verilog实现,包含tb测试文件和MATLAB辅助验证
    1.算法运行效果图预览FPGA的仿真图如下:   将数据导入MATLAB,对比结果如下:  2.算法运行软件版本MATLAB2022a vivado2019.2 3.部分核心程序  `timescale1ns/1ps////Company://Engineer:////CreateDate:2023/01/1901:47:15//DesignNa......