FPGA學習筆記之格雷碼、邊沿檢測、門控時鍾


一、格雷碼

格雷碼的優點主要是進位時只有一位跳變,誤碼率低。

1、二進制轉格雷碼

我們觀察下表:

二進制碼 格雷碼
00 00
01 01
10 11
11 10

二進制碼表示為B[],格雷碼表示為G[],則有

G(i) = B(i),i為最高位

G(i-1) = B(i) xor B(i-1),i非最高位

用verilog可以這樣寫

1 reg [WIDTH-1:0] bin;
2 reg [WIDTH-1:0] gray;
3 parameter WIDTH = 8;
4 always @(posedge clk or negedge rst_n) begin
5   if (!rst) 
6     gray <= 8'b0;
7   else
8     gray <= bin^(bin>>1);  //左移一位異或,從而最高位不變,次高與最高異或
9 end

 

2、格雷碼轉二進制

對照上表,一張圖可以理解:

verilog代碼可以這樣寫

reg [WIDTH-1:0] bin;
reg [WIDTH-1:0] gray;
parameter WIDTH = 8;
always @(posedge clk or negedge rst_n) begin
    if(!rst)
        bin = 8'b0;
    else
        bin = bin^(gray>>1);      
end

 

二、邊沿檢測

輸入一個跳變信號,如按鍵輸入、時鍾輸入,輸出指示高電平、低電平或者跳變(雙邊沿),綜合出的電路如下:

基本思想是利用同步時鍾控制兩個級聯的D觸發器,待檢測信號輸入到第一個D觸發器的輸入端,因為D觸發器之間有一個時鍾的時間延遲,因此取兩個D觸發器之間的信號(命名為dly1)和后一個D觸發器的輸出(命名為dly2),如果時鍾是上升的,那么第一個D觸發器輸出(即dly1)為高電平,第二個為低電平,則(dly1)&(~dly2)為高,指示了上升沿,下降沿類似,雙沿我們自然可以想到,任一個邊沿信號為高,則輸出指示為高,用一個異或門即可解決。實踐中,兩個D觸發器還可能存在誤觸發,可以增加D觸發器的個數,來降低錯誤。

 

三、門控時鍾

     我們知道,時序電路里總會有一個sys_clk,這個clk一般是從外部晶體振盪器引進來的,但是我們也知道世界上沒有覺得理想的器件和路徑,引入的時鍾可能因為晶體各種噪聲干擾或者突然“抽風”了一下,導致時鍾抖動,這對時序電路來說是致命的。那么,怎么解決這種情況呢???

一種想法是輸入時鍾sys_clk的同時,給一個時鍾使能信號clk_en,兩者經過一個&門,這樣輸出可能會好點

,but真的嗎?看下圖時序

該有的還是會有,我們可以看到時鍾在clk高半周尾部使能的時候,可能產生極短的脈沖(毛刺),不言而喻,這個電路沒有達到理想效果。我們改怎么做呢???如題,“門控時鍾”就是解決這個的,電路如下

電路時序如下

即相當於clk_en等下一個時鍾才作用,沒有產生毛刺。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM