為什么格雷碼可以輔助解決多bit跨時鐘域的問題?讀完這篇文章,你就會進(jìn)一步了解事情的本質(zhì)。
重要的事情講三遍,由前文可知:
單bit通過兩級同步打拍可以有效的解決亞穩(wěn)態(tài)問題。
單bit通過兩級同步打拍可以有效的解決亞穩(wěn)態(tài)問題。
單bit通過兩級同步打拍可以有效的解決亞穩(wěn)態(tài)問題。
格雷碼是一種反射二進(jìn)制碼編碼方式,它兩個連續(xù)的值只相差一位(二進(jìn)制數(shù)字)。它屬于一種被稱為最小變化碼的代碼,在這種代碼中,相鄰的兩個碼字中只有一個比特發(fā)生變化。這是一個未加權(quán)的代碼,這意味著沒有為位置分配特定的權(quán)重。
生成方式如下圖所示
4位寬格雷碼與十進(jìn)制二進(jìn)制的對應(yīng)關(guān)系如下:
Decimal | Binary | Gray |
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 |
如4bit的格雷碼一頭一尾也是兩個相鄰碼,一個是0000,一個是1000,它們的變換也是只有1bit。是不是很熟悉。對頭,“如果是單bit變化的話,可以采用兩級打拍的方式進(jìn)行時鐘域同步”。
按照這個思路,我們是不是可以將多bit數(shù)據(jù)轉(zhuǎn)換為格雷碼?然后采用兩級打拍的方式同步呢?如果源數(shù)據(jù)是遞增的方式,可以考慮這種處理方式的可能性。如果源數(shù)據(jù)也是變化無常的,則這種思路就只能嘎然而止了。
二進(jìn)制轉(zhuǎn)格雷碼的方法:
GrayCode最高位G[N]等于二進(jìn)制碼最高位B[N],GrayCode第n位等于二進(jìn)制碼B[n+1]位異或二進(jìn)制碼B[n]位。
以4位寬碼字為例,RTL圖如下:
格雷碼轉(zhuǎn)二進(jìn)制碼的方法:
二進(jìn)制碼最高位B[N]等于格雷碼最高位G[N],二進(jìn)制碼第n位B[n]等于二進(jìn)制碼B[n+1]位異或格雷碼第n位G[n]。
以4位寬碼字為例,RTL圖如下:
那么,異步FIFO是如何通過格雷碼,實現(xiàn)跨時鐘域高效處理的呢?我們下期再講。
你是否有所收獲?你肯定可以參考上述原理和電路,寫出二進(jìn)制與格雷碼之間的verilog轉(zhuǎn)換代碼。
module B2G #( parameter N = 4 ( input [N-1:0] B, output reg [N-1:0] G ); integer i; always @(*) begin G[N-1] = B[N-1]; for(i=N-2; i>=0; i=i-1) begin G[i] = B[i+1] ^ B[i]; end end endmodule
module G2B #( parameter N = 4 ( input [N-1:0] G, output reg [N-1:0] B ); integer i; always @(*) begin B[N-1] = G[N-1]; for(i=N-2; i>=0; i=i-1) begin B[i] = B[i+1] ^ G[i]; end end endmodule
審核編輯:劉清
-
二進(jìn)制
+關(guān)注
關(guān)注
2文章
795瀏覽量
41653 -
fifo
+關(guān)注
關(guān)注
3文章
388瀏覽量
43682 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59789 -
格雷碼
+關(guān)注
關(guān)注
2文章
34瀏覽量
13191 -
時鐘域
+關(guān)注
關(guān)注
0文章
52瀏覽量
9536
原文標(biāo)題:為什么格雷碼可以輔助解決多bit跨時鐘域的問題??
文章出處:【微信號:傅里葉的貓,微信公眾號:傅里葉的貓】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論