設計背景:
典型的二進制格雷碼(Binary Gray Code)簡稱格雷碼,因1953年公開的弗蘭克·格雷(Frank Gray,18870913-19690523)專利“Pulse Code Communication”而得名,當初是為了通信,現在則常用于模擬-數字轉換和位置-數字轉換中。法國電訊工程師波特(Jean-Maurice-émile Baudot,18450911-19030328)在1880年曾用過的波特碼相當于它的一種變形。1941年George Stibitz設計的一種8元二進制機械計數器正好符合格雷碼計數器的計數規律。
設計原理:
在一組數的編碼中,若任意兩個相鄰的代碼只有一位二進制數不同,則稱這種編碼為格雷碼(GrayCode),另外由于最大數與最小數之間也僅一位數不同,即“首尾相連”,因此又稱循環碼或反射碼。在數字系統中,常要求代碼按一定順序變化。例如,按自然數遞增計數,若采用8421碼,則數0111變到1000時四位均要變化,而在實際電路中,4位的變化不可能絕對同時發生,則計數中可能出現短暫的其它代碼(1100、1111等)。在特定情況下可能導致電路狀態錯誤或輸入錯誤。使用格雷碼可以避免這種錯誤。格雷碼有多種編碼形式。
格雷碼(GrayCode)曾用過GreyCode、葛萊碼、格萊碼、戈萊碼、循環碼、反射二進制碼、最小差錯碼等名字,它們有的不對,有的易與其它名稱混淆,建議不要再使用這些曾用名。
1位格雷碼有兩個碼字
(n+1)位格雷碼中的前2n個碼字等于n位格雷碼的碼字,按順序書寫,加前綴0
(n+1)位格雷碼中的后2n個碼字等于n位格雷碼的碼字,按逆序書寫,加前綴1
設計代碼:
設計模塊
0moduleb_g_b(bin,bo);//端口列表
1
2 input[7:0]bin;//8位二進制輸入
3
4 reg[8:0]bi;
5 outputreg[8:0]bo;//8位二進制輸出
6 reg[8:0]g;
7
8 //二進制轉格雷碼
9 integeri;
10 always@(*)
11 begin
12 bi =bin;
13 bi[8]=0;
14 for(i =7;i >=0;i =i -1)
15 g[i]=bi[i]^bi[1+i];
16
17 end
18
19 //格雷碼轉二進制
20 always@(*)
21 begin
22 bo[8]=0;
23 for(i =7;i >=0;i =i -1)
24 bo[i]=g[i]^bo[i +1];
25 end
26
27endmodule
測試模塊
1
2moduletb;
3
4 reg[7:0]bi;
5 wire[7:0]bo;
6
7 initialbegin
8 bi =0;
9
10 #50bi =8'haa;//二進制模擬
11 #50bi =8'hff;
12 #50bi =8'h55;
13 #50bi =8'hff;
14
15 #200$stop;//停止
16
17 end
18
19 b_g_b dut(.bin(bi),.bo(bo));//端口例化
20
21endmodule
仿真圖:
設計背景:
典型的二進制格雷碼(Binary Gray Code)簡稱格雷碼,因1953年公開的弗蘭克·格雷(Frank Gray,18870913-19690523)專利“Pulse Code Communication”而得名,當初是為了通信,現在則常用于模擬-數字轉換和位置-數字轉換中。法國電訊工程師波特(Jean-Maurice-émile Baudot,18450911-19030328)在1880年曾用過的波特碼相當于它的一種變形。1941年George Stibitz設計的一種8元二進制機械計數器正好符合格雷碼計數器的計數規律。
設計原理:
在一組數的編碼中,若任意兩個相鄰的代碼只有一位二進制數不同,則稱這種編碼為格雷碼(GrayCode),另外由于最大數與最小數之間也僅一位數不同,即“首尾相連”,因此又稱循環碼或反射碼。在數字系統中,常要求代碼按一定順序變化。例如,按自然數遞增計數,若采用8421碼,則數0111變到1000時四位均要變化,而在實際電路中,4位的變化不可能絕對同時發生,則計數中可能出現短暫的其它代碼(1100、1111等)。在特定情況下可能導致電路狀態錯誤或輸入錯誤。使用格雷碼可以避免這種錯誤。格雷碼有多種編碼形式。
格雷碼(GrayCode)曾用過GreyCode、葛萊碼、格萊碼、戈萊碼、循環碼、反射二進制碼、最小差錯碼等名字,它們有的不對,有的易與其它名稱混淆,建議不要再使用這些曾用名。
1位格雷碼有兩個碼字
(n+1)位格雷碼中的前2n個碼字等于n位格雷碼的碼字,按順序書寫,加前綴0
(n+1)位格雷碼中的后2n個碼字等于n位格雷碼的碼字,按逆序書寫,加前綴1
設計代碼:
設計模塊
0moduleb_g_b(bin,bo);//端口列表
1
2 input[7:0]bin;//8位二進制輸入
3
4 reg[8:0]bi;
5 outputreg[8:0]bo;//8位二進制輸出
6 reg[8:0]g;
7
8 //二進制轉格雷碼
9 integeri;
10 always@(*)
11 begin
12 bi =bin;
13 bi[8]=0;
14 for(i =7;i >=0;i =i -1)
15 g[i]=bi[i]^bi[1+i];
16
17 end
18
19 //格雷碼轉二進制
20 always@(*)
21 begin
22 bo[8]=0;
23 for(i =7;i >=0;i =i -1)
24 bo[i]=g[i]^bo[i +1];
25 end
26
27endmodule
測試模塊
0`timescale1ns/1ps//仿真時標
1
2moduletb;
3
4 reg[7:0]bi;
5 wire[7:0]bo;
6
7 initialbegin
8 bi =0;
9
10 #50bi =8'haa;//二進制模擬
11 #50bi =8'hff;
12 #50bi =8'h55;
13 #50bi =8'hff;
14
15 #200$stop;//停止
16
17 end
18
19 b_g_b dut(.bin(bi),.bo(bo));//端口例化
20
21endmodule
仿真圖:
在仿真圖中可以得到,在設計文件中設計的輸入二進制為00 55 等等,在轉化后的輸出模塊中可以清楚的看到輸入和輸出是一樣的,通過仿真可以得到本次設計正確。
-
FPGA
+關注
關注
1629文章
21729瀏覽量
603009
發布評論請先 登錄
相關推薦
評論