|
勇敢的芯伴你玩轉(zhuǎn)Altera FPGA連載36:Verilog代碼風(fēng)格之寄存器電路的設(shè)計方式 特權(quán)同學(xué),版權(quán)所有 配套例程和更多資料下載鏈接: http://pan.baidu.com/s/1i5LMUUD
上一章節(jié)中也已經(jīng)基本介紹了寄存器的基本原型,在現(xiàn)代邏輯設(shè)計中,時序邏輯設(shè)計是核心,而寄存器又是時序邏輯的基礎(chǔ)。因此,掌握時序邏輯的幾種常見代碼書寫方式又是基礎(chǔ)中的基礎(chǔ)。下面我們就以圖文(代碼)并茂的方式來學(xué)習(xí)這些基本寄存器模型的代碼書寫。 ① 簡單的寄存器輸入輸出的模型如圖5.2所示。每個時鐘信號clk的有效沿(通常是上升沿),輸入端數(shù)據(jù)din將被鎖存到輸出端dout。
圖5.2 基本寄存器 基本的代碼書寫方式如下: // Verilog例程 module dff(clk, din,dout); input clk; input din; output dout; reg dout; always @ (posedgeclk) begin dout <= din; end endmodule ② 帶異步復(fù)位的寄存器輸入輸出的模型如圖5.3所示。每個時鐘信號clk的有效沿(通常是上升沿),輸入端數(shù)據(jù)din將被鎖存到輸出端dout;而異步復(fù)位信號clr的下降沿(低電平有效復(fù)位)將強(qiáng)制給輸出數(shù)據(jù)dout賦值為0(不論此時的輸入數(shù)據(jù)din取值),此輸出狀態(tài)將一直保持到clr拉高后的下一個clk有效觸發(fā)沿。
圖5.3 異步復(fù)位的寄存器 基本的代碼書寫方式如下: // Verilog例程 module dff(clk, rst_n,din, dout); input clk; input rst_n; input din; output dout; reg dout; always @ (posedge clkor negedge rst_n) begin if(!rst_n) dout <= 1'b0; else dout <= din; end endmodule ③ 帶異步置位的寄存器輸入輸出的模型如圖5.4所示。每個時鐘信號clk的有效沿(通常是上升沿),輸入端數(shù)據(jù)din將被鎖存到輸出端dout;而異步置位信號set的上升沿(高電平有效置位)將強(qiáng)制給輸出數(shù)據(jù)dout賦值為1(不論此時的輸入數(shù)據(jù)din取值),此輸出狀態(tài)將一直保持到set拉低后的下一個clk有效觸發(fā)沿。
圖5.4 異步置位的寄存器 基本的代碼書寫方式如下: // Verilog例程 module dff(clk, set,din, dout); input clk; input din; input set; output dout; reg dout; always @ (posedge clkor posedge set) begin if(set) dout <= 1'b1; else dout <= din; end endmodule ④ 既帶異步復(fù)位,又帶異步置位的寄存器則如圖5.5所示。既帶異步復(fù)位,又帶異步置位的寄存器其實(shí)是個很矛盾的模型,我們可以簡單的分析一下,如果set和clr都處于無效狀態(tài)(set=0,clr=1),那么寄存器正常工作;如果set有效(set=1)且clr無效(clr=1),那么dout=1沒有異議;同理,如果set無效(set=0)且clr有效(clr=0),那么dout=0也沒有異議;但是如果set和clr同時有效(set=1,clr=0),輸出dout咋辦?到底是1還是0?
圖5.5 異步復(fù)位和置位的寄存器 其實(shí)這個問題也不難,設(shè)置一個優(yōu)先級不就好了。當(dāng)然了,圖5.5的理想寄存器模型通常只是作為電路的一部分來實(shí)現(xiàn)。如果我們期望這種既帶異步復(fù)位,又帶異步置位的寄存器在復(fù)位和置位同時出現(xiàn)時,異步復(fù)位的優(yōu)先級高一些,那么代碼書寫方式可以如下: // Verilog例程 module dff(clk,rst_n, set, din, dout); input clk; input din; input rst_n; input set; output dout; reg dout; always @ (posedge clkor negedge rst_n posedge set) begin if(!rst_n) dout <= 1’b0; else if(set)dout <= 1'b1; else dout <= din; end endmodule 這樣的代碼,綜合出來的寄存器視圖則如圖5.6所示。
圖5.6 異步復(fù)位和置位的寄存器(復(fù)位優(yōu)先級高) ⑤ 如圖5.7所示,這是一種很常見的帶同步使能功能的寄存器。每個時鐘clk的有效沿(通常是上升沿),判斷使能信號ena是否有效(我們?nèi)「唠娖綖橛行В趀na信號有效的情況下din的值才會輸出到dout信號上。
圖5.7 帶同步使能的寄存器 基本的代碼書寫方式如下: // Verilog例程 module dff(clk, ena,din, dout); input clk; input din; input ena; output dout; reg dout; always @ (posedge clk)begin if(ena) dout <= din; end endmodule |