1. 程式人生 > >FPGA兩種寄存器的使能

FPGA兩種寄存器的使能

合成 png 一個數 輸入 連續 電路 center nbsp 非阻塞

在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使用。

FPGA兩種寄存器的使能