設(shè)計(jì)背景:
典型的二進(jìn)制格雷碼(Binary Gray Code)簡(jiǎn)稱格雷碼,因1953年公開的弗蘭克·格雷(Frank Gray,18870913-19690523)專利“Pulse Code Communication”而得名,當(dāng)初是為了通信,現(xiàn)在則常用于模擬-數(shù)字轉(zhuǎn)換和位置-數(shù)字轉(zhuǎn)換中。法國(guó)電訊工程師波特(Jean-Maurice-émile Baudot,18450911-19030328)在1880年曾用過(guò)的波特碼相當(dāng)于它的一種變形。1941年George Stibitz設(shè)計(jì)的一種8元二進(jìn)制機(jī)械計(jì)數(shù)器正好符合格雷碼計(jì)數(shù)器的計(jì)數(shù)規(guī)律。
設(shè)計(jì)原理:
在一組數(shù)的編碼中,若任意兩個(gè)相鄰的代碼只有一位二進(jìn)制數(shù)不同,則稱這種編碼為格雷碼(GrayCode),另外由于最大數(shù)與最小數(shù)之間也僅一位數(shù)不同,即“首尾相連”,因此又稱循環(huán)碼或反射碼。在數(shù)字系統(tǒng)中,常要求代碼按一定順序變化。例如,按自然數(shù)遞增計(jì)數(shù),若采用8421碼,則數(shù)0111變到1000時(shí)四位均要變化,而在實(shí)際電路中,4位的變化不可能絕對(duì)同時(shí)發(fā)生,則計(jì)數(shù)中可能出現(xiàn)短暫的其它代碼(1100、1111等)。在特定情況下可能導(dǎo)致電路狀態(tài)錯(cuò)誤或輸入錯(cuò)誤。使用格雷碼可以避免這種錯(cuò)誤。格雷碼有多種編碼形式。
格雷碼(GrayCode)曾用過(guò)GreyCode、葛萊碼、格萊碼、戈萊碼、循環(huán)碼、反射二進(jìn)制碼、最小差錯(cuò)碼等名字,它們有的不對(duì),有的易與其它名稱混淆,建議不要再使用這些曾用名。
1位格雷碼有兩個(gè)碼字
(n+1)位格雷碼中的前2n個(gè)碼字等于n位格雷碼的碼字,按順序書寫,加前綴0
(n+1)位格雷碼中的后2n個(gè)碼字等于n位格雷碼的碼字,按逆序書寫,加前綴1
設(shè)計(jì)代碼:
設(shè)計(jì)模塊
0moduleb_g_b(bin,bo);//端口列表
1
2 input[7:0]bin;//8位二進(jìn)制輸入
3
4 reg[8:0]bi;
5 outputreg[8:0]bo;//8位二進(jìn)制輸出
6 reg[8:0]g;
7
8 //二進(jìn)制轉(zhuǎn)格雷碼
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 //格雷碼轉(zhuǎn)二進(jìn)制
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
測(cè)試模塊
0`timescale1ns/1ps//仿真時(shí)標(biāo)
1
2moduletb;
3
4 reg[7:0]bi;
5 wire[7:0]bo;
6
7 initialbegin
8 bi =0;
9
10 #50bi =8'haa;//二進(jìn)制模擬
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
仿真圖:
設(shè)計(jì)背景:
典型的二進(jìn)制格雷碼(Binary Gray Code)簡(jiǎn)稱格雷碼,因1953年公開的弗蘭克·格雷(Frank Gray,18870913-19690523)專利“Pulse Code Communication”而得名,當(dāng)初是為了通信,現(xiàn)在則常用于模擬-數(shù)字轉(zhuǎn)換和位置-數(shù)字轉(zhuǎn)換中。法國(guó)電訊工程師波特(Jean-Maurice-émile Baudot,18450911-19030328)在1880年曾用過(guò)的波特碼相當(dāng)于它的一種變形。1941年George Stibitz設(shè)計(jì)的一種8元二進(jìn)制機(jī)械計(jì)數(shù)器正好符合格雷碼計(jì)數(shù)器的計(jì)數(shù)規(guī)律。
設(shè)計(jì)原理:
在一組數(shù)的編碼中,若任意兩個(gè)相鄰的代碼只有一位二進(jìn)制數(shù)不同,則稱這種編碼為格雷碼(GrayCode),另外由于最大數(shù)與最小數(shù)之間也僅一位數(shù)不同,即“首尾相連”,因此又稱循環(huán)碼或反射碼。在數(shù)字系統(tǒng)中,常要求代碼按一定順序變化。例如,按自然數(shù)遞增計(jì)數(shù),若采用8421碼,則數(shù)0111變到1000時(shí)四位均要變化,而在實(shí)際電路中,4位的變化不可能絕對(duì)同時(shí)發(fā)生,則計(jì)數(shù)中可能出現(xiàn)短暫的其它代碼(1100、1111等)。在特定情況下可能導(dǎo)致電路狀態(tài)錯(cuò)誤或輸入錯(cuò)誤。使用格雷碼可以避免這種錯(cuò)誤。格雷碼有多種編碼形式。
格雷碼(GrayCode)曾用過(guò)GreyCode、葛萊碼、格萊碼、戈萊碼、循環(huán)碼、反射二進(jìn)制碼、最小差錯(cuò)碼等名字,它們有的不對(duì),有的易與其它名稱混淆,建議不要再使用這些曾用名。
1位格雷碼有兩個(gè)碼字
(n+1)位格雷碼中的前2n個(gè)碼字等于n位格雷碼的碼字,按順序書寫,加前綴0
(n+1)位格雷碼中的后2n個(gè)碼字等于n位格雷碼的碼字,按逆序書寫,加前綴1
設(shè)計(jì)代碼:
設(shè)計(jì)模塊
0moduleb_g_b(bin,bo);//端口列表
1
2 input[7:0]bin;//8位二進(jìn)制輸入
3
4 reg[8:0]bi;
5 outputreg[8:0]bo;//8位二進(jìn)制輸出
6 reg[8:0]g;
7
8 //二進(jìn)制轉(zhuǎn)格雷碼
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 //格雷碼轉(zhuǎn)二進(jìn)制
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
測(cè)試模塊
0`timescale1ns/1ps//仿真時(shí)標(biāo)
1
2moduletb;
3
4 reg[7:0]bi;
5 wire[7:0]bo;
6
7 initialbegin
8 bi =0;
9
10 #50bi =8'haa;//二進(jìn)制模擬
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
仿真圖:
在仿真圖中可以得到,在設(shè)計(jì)文件中設(shè)計(jì)的輸入二進(jìn)制為00 55 等等,在轉(zhuǎn)化后的輸出模塊中可以清楚的看到輸入和輸出是一樣的,通過(guò)仿真可以得到本次設(shè)計(jì)正確。
-
FPGA
+關(guān)注
關(guān)注
1630文章
21759瀏覽量
604357
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論