為什么格雷碼可以輔助解決多bit跨時鐘域的問題?讀完這篇文章,你就會進一步了解事情的本質。
重要的事情講三遍,由前文可知:
單bit通過兩級同步打拍可以有效的解決亞穩態問題。
單bit通過兩級同步打拍可以有效的解決亞穩態問題。
單bit通過兩級同步打拍可以有效的解決亞穩態問題。
格雷碼是一種反射二進制碼編碼方式,它兩個連續的值只相差一位(二進制數字)。它屬于一種被稱為最小變化碼的代碼,在這種代碼中,相鄰的兩個碼字中只有一個比特發生變化。這是一個未加權的代碼,這意味著沒有為位置分配特定的權重。
生成方式如下圖所示
4位寬格雷碼與十進制二進制的對應關系如下:
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變化的話,可以采用兩級打拍的方式進行時鐘域同步”。
按照這個思路,我們是不是可以將多bit數據轉換為格雷碼?然后采用兩級打拍的方式同步呢?如果源數據是遞增的方式,可以考慮這種處理方式的可能性。如果源數據也是變化無常的,則這種思路就只能嘎然而止了。
二進制轉格雷碼的方法:
GrayCode最高位G[N]等于二進制碼最高位B[N],GrayCode第n位等于二進制碼B[n+1]位異或二進制碼B[n]位。
以4位寬碼字為例,RTL圖如下:
格雷碼轉二進制碼的方法:
二進制碼最高位B[N]等于格雷碼最高位G[N],二進制碼第n位B[n]等于二進制碼B[n+1]位異或格雷碼第n位G[n]。
以4位寬碼字為例,RTL圖如下:
那么,異步FIFO是如何通過格雷碼,實現跨時鐘域高效處理的呢?我們下期再講。
你是否有所收獲?你肯定可以參考上述原理和電路,寫出二進制與格雷碼之間的verilog轉換代碼。
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
審核編輯:劉清
-
二進制
+關注
關注
2文章
795瀏覽量
41643 -
fifo
+關注
關注
3文章
387瀏覽量
43649 -
RTL
+關注
關注
1文章
385瀏覽量
59761 -
格雷碼
+關注
關注
2文章
34瀏覽量
13185 -
時鐘域
+關注
關注
0文章
52瀏覽量
9535
原文標題:為什么格雷碼可以輔助解決多bit跨時鐘域的問題??
文章出處:【微信號:傅里葉的貓,微信公眾號:傅里葉的貓】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論