【 FPGA 】特定情況下消除不穩定態的方法
不是沒有方法,但方法也不多,最典型的就是使用格雷碼。
消除不穩定態的原理
通過對多觸發器暫存器的分析,我們知道了產生不穩定態的原因,那就是組成暫存器的各個觸發器輸出變化時刻的客觀不一致性。(我們希望各個觸發器輸出變化時刻一致)。因此,要想消除不穩定態,就必須消除多觸發器輸出變化時刻的不一致才行。可觸發器不可能完全一致,更沒有精確等長的物理連線,所以想要協調一致多個觸發器的輸出變化時刻來消除暫存器輸出的不穩定態, 幾乎是不可能的。
此路不通,換個思路。
如果能讓暫存器中的各個觸發器每次只有一個輸出會發生變化,那麼自然就不存在變化時刻不一致的問題了,從而從根本上杜絕了不穩定態的產生。
格雷碼簡介
格雷碼是一種數字排序系統,其中的所有相鄰整數在它們的二進位制表示中僅有一位不同。
下表給出了4bit自然二進位制碼、格雷碼與十進位制整數的對照表:
十進位制數 | 4位自然二進位制碼 | 4位典型格雷碼 |
---|---|---|
0 |
0000 |
0000 |
1 |
0001 |
0001 |
2 |
0010 |
0011 |
3 |
0011 |
0010 |
4 |
0100 |
0110 |
5 |
0101 |
0111 |
6 |
0110 |
0101 |
7 |
0111 |
0100 |
8 |
1000 |
1100 |
9 |
1001 |
1101 |
10 |
1010 |
1111 |
11 |
1011 |
1110 |
12 |
1100 |
1010 |
13 |
1101 |
1011 |
14 |
1110 |
1001 |
15 |
1111 |
1000 |
從上表可以看出,格雷碼在任意兩個相鄰的數之間轉換時,只有1bit發生了變化,所以它有效地避免了暫存器從一個數值到下一個數值時的不穩定態。
由於格雷碼中最大數和最小數之間也僅有1bit不同,所以又稱為迴圈二進位制碼,或者反射二進位制碼。
常用的格雷碼編解碼方法
1從自然二進位制碼到格雷碼:該過程又稱為格雷碼的編碼。
方法是從二進位制碼的最右邊一位(最低位)起,依次將每一位與左邊一位進行異或運算,作為對應格雷碼該位的值,而最左邊一位(最高位)不變。對應的公式為:
例:
根據上面的公式很容易寫出二進位制碼轉換為格雷碼的程式:(Verilog HDL)
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
2 從格雷碼到二進位制碼:該過程又叫格雷碼的解碼,方法是從格雷碼左邊第二位(次高位)起,將每一位與其左邊一位解碼後的值異或,作為該位解碼後的值,而最高位的解碼結果是其本身。對應公式如下:
例:
根據上面的公式,很容易編寫出轉換程式:(Verilog HDL)
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
參考:
FPGA之道