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