FPGA兩種寄存器的使能
阿新 • • 發佈:2017-05-12
合成 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兩種寄存器的使能