格雷碼是一種常見的編碼方式,相鄰狀態間只有一位不同;這就意味著相鄰兩個狀態間進行轉換時,只有一位發生變化,因而極大的減小了出錯機率。(反之,如果使用二進位制編碼,如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轉換成數字量送至系統進行進一步處理。此方法精度高,但在多路 長距離位置監...