Verilog實現二進位製碼與格雷碼轉換

2021-10-04 01:40:05 字數 3964 閱讀 8233

格雷碼是一種常見的編碼方式,相鄰狀態間只有一位不同;這就意味著相鄰兩個狀態間進行轉換時,只有一位發生變化,因而極大的減小了出錯機率。(反之,如果使用二進位制編碼,如011->100時三位均發生改變,因此出錯的機率就會大大增加)。格雷碼以及其餘常見編碼的知識詳見:

verilog常見編碼方式:二進位製碼、格雷碼、獨熱碼

如上所述,格雷碼作為一種錯誤最小化的編碼方式,常用於狀態機等多種場合。二進位制與格雷碼相互轉換的問題也很可能遇到,此處就針對這一問題進行分析與**。

目錄

一、格雷碼與二進位製碼

二、二進位制與格雷碼的轉換

三、**驗證

四、參考文獻:

以3位二進位製碼和格雷碼作為示例,演示兩者的編碼方式以及相互關係:

二進位制-格雷碼對照表 編號

二進位制格雷碼

0000

0001

001001

2010

0113

011010

4100

1105

101111

6110

1017

111100

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;

endelse

begin

ls_bin = bin >> 1;

gout = ls_bin ^ bin;

endend

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)

二進位制全加器設計 一位全加器使用乘積項之和的形式可以表示為 sum a b c in a b c in a b c in a b c in c out a b b c in a c in 其中a,b和c in為輸入,sum和c out為輸出,只使用與門,或門,非門實現乙個一位全加器,寫出veril...

二進位制格雷碼與自然二進位製碼的互換

原始網頁 http www.pcdog.com a 19 10 a210086.html 在精確定位控制系統中,為了提高控制精度,準確測量控制物件的位置是十分重要的。目前,檢測位置的辦法有兩種 其一是使用位置感測器,測量到的位移量由變送器經a d轉換成數字量送至系統進行進一步處理。此方法精度高,但在...

二進位制格雷碼與自然二進位製碼的互換

二進位制格雷碼與自然二進位製碼的互換 中國科學院光電技術研究所 遊志宇 在精確定位控制系統中,為了提高控制精度,準確測量控制物件的位置是十分重要的。目前,檢測位置的辦法有兩種 其一是使用位置感測器,測量到的位移量由變送器經a d轉換成數字量送至系統進行進一步處理。此方法精度高,但在多路 長距離位置監...