|
格雷碼是一個(gè)叫弗蘭克*格雷的人在1953年發(fā)明的,最初用于通信。格雷碼是一種循環(huán)二進(jìn)制碼或者叫作反射二進(jìn)制碼。格雷碼的特點(diǎn)是從一個(gè)數(shù)變?yōu)橄噜彽囊粋€(gè)數(shù)時(shí),只有一個(gè)數(shù)據(jù)位發(fā)生跳變,由于這種特點(diǎn),就可以避免二進(jìn)制編碼計(jì)數(shù)組合電路中出現(xiàn)的亞穩(wěn)態(tài)。格雷碼常用于通信,F(xiàn)IFO或者RAM地址尋址計(jì)數(shù)器中。 如二進(jìn)制計(jì)數(shù)編碼從0到F的計(jì)數(shù)過程如下: 十進(jìn)制 | 二進(jìn)制 | 格雷碼 | 十進(jìn)制 | 二進(jìn)制 | 格雷碼 | 0 | 0000 | 0000 | 8 | 1000 | 1100 | 1 | 0001 | 0001 | 9 | 1001 | 1101 | 2 | 0010 | 0011 | 10 | 1010 | 1111 | 3 | 0011 | 0010 | 11 | 1011 | 1110 | 4 | 0100 | 0110 | 12 | 1100 | 1010 | 5 | 0101 | 0111 | 13 | 1101 | 1011 | 6 | 0110 | 0101 | 14 | 1110 | 1001 | 7 | 0111 | 0100 | 15 | 1111 | 1000 |
當(dāng)從7變?yōu)?時(shí),4位二進(jìn)制數(shù)都發(fā)生跳變,這就很可能會發(fā)生亞穩(wěn)態(tài)。而采用格雷碼,就可以編碼4位二進(jìn)制數(shù)都同時(shí)發(fā)生跳變,導(dǎo)致出現(xiàn)的亞穩(wěn)態(tài),就算出現(xiàn)亞穩(wěn)態(tài),最多也就一位出現(xiàn)錯(cuò)誤。 格雷碼轉(zhuǎn)二進(jìn)制 觀察上表可知,格雷碼轉(zhuǎn)二進(jìn)制是從左邊第二位起,將每位與左邊一位二進(jìn)制碼的值異或,作為該位二進(jìn)制碼后的值(最左邊一位依然不變)。 module gray_to_bin( gray_in, bin_out ); parameter data_width = 4; input [data_width-1:0] gray_in; output [data_width-1:0] bin_out; reg [data_width-1:0] bin_out; always @(gray_in) begin bin_out[3] = gray_in[3]; bin_out[2] = gray_in[2]^bin_out[3]; bin_out[1] = gray_in[1]^bin_out[2]; bin_out[0] = gray_in[0]^bin_out[1]; end endmodule |
二進(jìn)制轉(zhuǎn)格雷碼 從最右邊一位起,依次將每一位與左邊一位異或(XOR),作為對應(yīng)格雷碼該位的值,最左邊一位不變。 module bin_to_gray( bin_in, gray_out ); parameter data_width = 4; input [data_width-1:0] bin_in; output [data_width-1:0] gray_out; assign gray_out = (bin_in >> 1) ^ bin_in; endmodule |
格雷碼計(jì)數(shù)器原理 格雷碼計(jì)數(shù)器,采用三個(gè)模塊進(jìn)行設(shè)計(jì),格雷碼轉(zhuǎn)二進(jìn)制、加法器、二進(jìn)制轉(zhuǎn)格雷碼。 格雷碼轉(zhuǎn)二進(jìn)制將格雷碼轉(zhuǎn)換為二進(jìn)制,并將值輸出用于加法器進(jìn)行加法運(yùn)算,然后將加法運(yùn)算結(jié)果通過二進(jìn)制轉(zhuǎn)格雷碼轉(zhuǎn)換為格雷碼,最后將格雷碼進(jìn)行輸出,同時(shí)將結(jié)果輸出到格雷碼轉(zhuǎn)二進(jìn)制作為輸入,形成一個(gè)計(jì)數(shù)功能。 頂層設(shè)計(jì) module gray_counter( clk, reset_n, // gray_in, gray_out ); parameter data_width = 4; input clk; input reset_n; // input [data_width-1:0] gray_in; output [data_width-1:0] gray_out; //格雷碼轉(zhuǎn)二進(jìn)制 wire [data_width-1:0] bin_out; gray_to_bin gray_to_bin_1( .gray_in (gray_wire), .bin_out (bin_out) ); //二進(jìn)制加一 wire [data_width-1:0] bin_add_wire; assign bin_add_wire = bin_out + 1'b1; //二進(jìn)制轉(zhuǎn)格雷碼 wire [data_width-1:0] gray_wire; reg [data_width-1:0] gray_out; bin_to_gray bin_to_gray_1( .bin_in (bin_add_wire), .gray_out (gray_wire) ); always @(posedge clk or negedge reset_n) begin if(reset_n == 1'b0) begin gray_out <= {data_width{1'b0}}; end else begin gray_out <= gray_wire; end end endmodule |
RTL視圖,與設(shè)計(jì)框圖一致 實(shí)驗(yàn)結(jié)果 經(jīng)過與上表對比,驗(yàn)證了功能的正確性。
|