FPGA兩種寄存器的使能


在FPGA中,寄存器的使能設計一般有兩種方式:

1.直接使用寄存器的使能端口。

2.使用一個數據選擇器連接寄存器的D端口,通過數據選擇器的sel端口做使能。如下圖

 

 

 

 

 

 

這個方式與直接使用寄存器的CE端口有什么區別呢?

我們可以看出來,

1.在Q1為輸出端口時,此時這個結構所具有的功能和普通的寄存器是一樣的,當CE=1時,D經過數據選擇器選通在經過一個時鍾的延遲后到達Q1端口。CE=0時具有保存功能。是不是就是下面的寫法。

always@(posedge clk)begin
    if(CE)begin
        Q1 <= D;
    end
end

2.那在Q0為輸出端口是呢?此時當CE=1時,數據直接被選通輸出到Q0端口,沒有延遲。而當CE=0時也具有保持功能。

我們這里就會思考,沒有延遲,直接通過,那么我下面這樣寫是不是就是這種功能呢?

always@(posedge clk)begin
    if(CE)begin
        Q0 = D;
    end
end

將 非阻塞賦值 <=變成 =阻塞賦值, 那這樣行不行呢?下面就進行驗證

這是綜合后的電路,直接告訴我們這個寫法和1寄存器的寫法是一樣的Q0與D同樣存在一個時鍾的延遲,並且下面這個仿真圖也驗證了我們的觀點。

這樣的寫法並不會綜合成2結構的電路,並且D端口與Q0端口存在一個時鍾的延遲。

事實上我們應該寫成以下形式:

module test
(
    input clk,
    input  D,
    input CE,
    output  Q0
);
    
reg Qt=0;
assign Q0 = CE ? D:Qt;
always@(posedge clk)begin
    if(CE)begin
        Qt <= D;
    end
end

endmodule

綜合出來的電路如下圖所示,這才是2結構的電路。

 

那講到這里,BB了這么多,這個電路結構到低有什么用呢? 下面我就舉個栗子

 

假設我們需要這樣一個功能

1. 連續輸入 x1 y1 x2 y2

2. 當 x1>0時 輸出 x1 否則 -x1

3. 當 x1>0時 輸出 y1 否則 -y1,即y1根據x1的符號進行輸出

4. 當 x2>0時 輸出 x2 否則 -x2

5. 當 x2>0時 輸出 y2 否則 -y2,即y2根據x2的符號進行輸出

那么我們就使用這樣的結構保存x的符號值,供y使用。

 


免責聲明!

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



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