HDLBits: 在線學(xué)習(xí) SystemVerilog(十四)-Problem 80-89(觸發(fā)器和鎖存器(1))
HDLBits 是一組小型電路設(shè)計(jì)習(xí)題集,使用 Verilog/SystemVerilog 硬件描述語言 (HDL) 練習(xí)數(shù)字硬件設(shè)計(jì)~
網(wǎng)址如下:
https://hdlbits.01xz.net/
關(guān)于HDLBits的Verilog實(shí)現(xiàn)可以查看下面專欄:
https://www.zhihu.com/column/c_1131528588117385216
縮略詞索引:
- SV:SystemVerilog
從今天開始新的一章-時(shí)序電路,包括觸發(fā)器、計(jì)數(shù)器、移位寄存器、狀態(tài)機(jī)等。
今天更新觸發(fā)器和鎖存器,這也是FPGA部分需要了解的基礎(chǔ)部分。
觸發(fā)器和鎖存器
《觸發(fā)器全知道》
《FPGA的設(shè)計(jì)中為什么避免使用鎖存器》
Problem 80-Dff
SystemVerilog中程序塊的使用
《SystemVerilog-程序塊 (procedural blocks)》
題目說明
D 觸發(fā)器是一個(gè)電路,存儲(chǔ) 1bit 數(shù)據(jù),并定期地根據(jù)觸發(fā)器的輸入(d)更新這 1 bit 數(shù)據(jù),更新通常發(fā)生在時(shí)鐘上升沿(clk)。存儲(chǔ)的數(shù)據(jù)會(huì)通過輸出管腳(q)輸出。
本題要求利用always程序塊創(chuàng)建一個(gè)D觸發(fā)器。
模塊端口聲明
moduletop_module(
inputclk,//Clocksareusedinsequentialcircuits
inputd,
outputregq);
題目解析
moduletop_module(
inputlogicclk,//Clocksareusedinsequentialcircuits
inputlogicd,
outputlogicq);//
//Useaclockedalways_ffblock
//copydtoqateverypositiveedgeofclk
//Clockedalways_ffblocksshouldusenon-blockingassignments
always_ff@(posedgeclk)begin
q<=?d?;
????end
endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 81-Dff8
題目說明
實(shí)現(xiàn) 8 個(gè) D 觸發(fā)器。
模塊端口聲明
moduletop_module(
inputclk,
input[7:0]d,
output[7:0]q
);
題目解析
不需要將上面的電路復(fù)制八遍,只需將輸入輸出的位寬提高到八位即可,綜合器會(huì)幫我們實(shí)現(xiàn)我們需要的8個(gè)觸發(fā)器。
moduletop_module(
inputlogicclk,
inputlogic[7:0]d,
outputlogic[7:0]q
);
always_ff@(posedgeclk)begin
q<=?d?;
????end
endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 82-Dff8r
題目說明
在上一題基礎(chǔ)上加上同步復(fù)位電路。
模塊端口聲明
moduletop_module(
inputclk,
inputreset,//Synchronousreset
input[7:0]d,
output[7:0]q
);
題目解析
這題難度不大,需要我們舉一反三:明白同步復(fù)位和異步復(fù)位。
對(duì)于電路中的時(shí)序元件,把復(fù)位信號(hào)受到時(shí)鐘的控制和復(fù)位信號(hào)不受時(shí)鐘的控制兩種電路分別稱為同步復(fù)位電路和異步復(fù)位電路。
moduletop_module(
inputlogicclk,
inputlogicreset,//Synchronousreset
inputlogic[7:0]d,
outputlogic[7:0]q
);
always_ff@(posedgeclk)begin
if(reset)q<=?'0;
else
q<=??d?;
????end
endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
在vivado中綜合的結(jié)果如下:
其中,F(xiàn)DRE:D Flip-Flop with Clock Enable and Synchronous Reset 帶使能功能的同步復(fù)位D觸發(fā)器。
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 83-Dff8p
題目說明
在上一題同步復(fù)位基礎(chǔ)上,觸發(fā)器必須復(fù)位時(shí)候?yàn)?0x34 而不是零。所有 DFF 都應(yīng)由clk的下降沿觸發(fā)。
模塊端口聲明
moduletop_module(
inputclk,
inputreset,
input[7:0]d,
output[7:0]q
);
題目解析
moduletop_module(
inputlogicclk,
inputlogicreset,//Synchronousreset
inputlogic[7:0]d,
outputlogic[7:0]q
);
always_ff@(negedgeclk)begin
if(reset)q<=?8'h34;
else
q<=??d?;
????end
endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 84-Dff8ar
題目說明
本題中的觸發(fā)器引入了異步復(fù)位。當(dāng)異步復(fù)位端有效時(shí),觸發(fā)器的輸出復(fù)位為 0 。
模塊端口聲明
moduletop_module(
inputclk,
inputareset,//activehighasynchronousreset
input[7:0]d,
output[7:0]q
);
題目解析
moduletop_module(
inputlogicclk,
inputlogicareset,//activehighasynchronousreset
inputlogic[7:0]d,
outputlogic[7:0]q
);
always_ff@(posedgeclkorposedgeareset)begin
if(areset)q<=?'0;
else
q<=??d?;
????end
endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
下圖是Vivado中綜合的結(jié)果:
FDC :: D Flip-Flop with Asynchronous Clear 帶異步清除D觸發(fā)器;FDCE:D Flip-Flop with Clock Enable and AsynchronousReset 帶使能功能的異步清除D觸發(fā)器,相比與FDRE將同步復(fù)位變化成異步復(fù)位,當(dāng)同步復(fù)位接口為高電平時(shí),直接觸發(fā)寄存器復(fù)位(置0)。
這一題就結(jié)束了。
Problem 85-Dff16e
題目說明
創(chuàng)建一個(gè) 16 路 D觸發(fā)器。部分情況下,只需要多路觸發(fā)器中的一部分觸發(fā)器工作,此時(shí)可以通過 ena 使能端進(jìn)行控制。使能端 ena 信號(hào)有效時(shí),觸發(fā)器在時(shí)鐘上升沿工作。
byteena 使能信號(hào)以 byte 為單位管理 8 路觸發(fā)器在時(shí)鐘邊沿觸發(fā)與否。byteena [1] 作為 d[15:8] 高位字節(jié)的使能端,byteena [0] 則控制 d 的低位字節(jié)。
resetn 為同步,低電平有效復(fù)位信號(hào)。
模塊端口聲明
moduletop_module(
inputclk,
inputresetn,
input[1:0]byteena,
input[15:0]d,
output[15:0]q
);
題目解析
moduletop_module(
inputlogicclk,
inputlogicresetn,
inputlogic[1:0]byteena,
inputlogic[15:0]d,
outputlogic[15:0]q
);
always_ff@(posedgeclk)begin
if(!resetn)q<=?'0;
elsebegin
case(byteena)
2'b01:
q<=?{q[15:8],?d[7:0]};
????????????????2'b10:
q<=?{d[15:8],?q[7:0]};
????????????????2'b11:
q<=?d;
????????????????2'b00:
q<=?q;
????????????endcase
????????end
????end
endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會(huì)對(duì)比這兩個(gè)波形,一旦這兩者不匹配,仿真結(jié)果會(huì)變紅。
這一題就結(jié)束了。
Problem 86-m2014 q4a
題目說明
實(shí)現(xiàn)一個(gè)如下的電路:
從看到圖片上的電路就應(yīng)該認(rèn)出這個(gè)基本元器件-鎖存器,同D觸發(fā)器對(duì)比這個(gè)元件沒有 clk 端口,取而代之的是 ena 端口。
鎖存器的特征在于,相較于 D觸發(fā)器的觸發(fā)事件發(fā)生于 clk 時(shí)鐘的邊沿,鎖存器鎖存的觸發(fā)事件發(fā)生于使能端 ena 的電平。
模塊端口聲明
moduletop_module(
inputd,
inputena,
outputq);
題目解析
moduletop_module(
inputlogicd,
inputlogicena,
outputlogicq);
always_latchbegin
if(ena)q<=?d?;
????????else
q<=?q?;
????end
endmodule
從上面的代碼可以看出,SV在硬件描述過程中比Verilog代碼可讀性高很多,一眼就能看出這個(gè)電路的功能,而Verilog需要根據(jù)描述的功能推測(cè)電路功能。
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形。但是注意圖中的警告,這個(gè)在實(shí)際使用中非常重要,鎖存器相比觸發(fā)器會(huì)消耗更多的資源,所以綜合器會(huì)在推斷出鎖存器時(shí)產(chǎn)生提醒,防止開發(fā)者在不想使用鎖存器時(shí),因?yàn)榇a風(fēng)格等原因誤產(chǎn)生了鎖存器。
這一題就結(jié)束了。
Problem 87-m2014_q4b
題目說明
實(shí)現(xiàn)一個(gè)如下的電路:
模塊端口聲明
moduletop_module(
inputclk,
inputd,
inputar,//asynchronousreset
outputq);
題目解析
AR 代表 asynchronous reset,所以這是一個(gè)帶有異步復(fù)位的 D 觸發(fā)器。
圖中的三角形代表時(shí)鐘,不再用 CLK 標(biāo)出。
moduletop_module(
inputlogicclk,
inputlogicd,
inputlogicar,//asynchronousreset
outputlogicq);
always_ff@(posedgeclkorposedgear)begin
if(ar)q<=?'0;
else
q<=??d?;
????end
endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形。
這一題就結(jié)束了。
Problem 88-m2014_q4c
題目說明
實(shí)現(xiàn)一個(gè)如下的電路:
模塊端口聲明
moduletop_module(
inputclk,
inputd,
inputr,//synchronousreset
outputq);
題目解析
R 代表 synchronous reset。所以這是一個(gè)同步復(fù)位的D觸發(fā)器。
moduletop_module(
inputlogicclk,
inputlogicd,
inputlogicr,//synchronousreset
outputlogicq);
always_ff@(posedgeclk)begin
if(r)q<=?'0;
else
q<=??d?;
????end
endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形。
這一題就結(jié)束了。
Problem 89-m2014_q4d
題目說明
實(shí)現(xiàn)一個(gè)如下的電路:
模塊端口聲明
moduletop_module(
inputclk,
inputin,
outputout);
題目解析
觸發(fā)器的輸出 q 和輸入信號(hào) in 一起作為異或門的輸入。
moduletop_module(
inputlogicclk,
inputlogicin,
outputlogicout);
varlogicd;
always_combbegin
d=out^in;
end
always_ff@(posedgeclk)begin
out<=?d?;
????end
endmodule
點(diǎn)擊Submit,等待一會(huì)就能看到下圖結(jié)果:
注意圖中無波形。
這一題就結(jié)束了。
總結(jié)
今天的幾道題就結(jié)束了,對(duì)于理解觸發(fā)器的非常有幫助,尤其同步復(fù)位、異步復(fù)位及鎖存器的理解非常有幫助,對(duì)于這些簡(jiǎn)單的代碼,建議放到實(shí)際的EDA工具中跑下綜合,查看一下FPGA具體的實(shí)現(xiàn)元器件是什么樣,這樣在后期自己設(shè)計(jì)代碼時(shí)候的理解很有幫助。
最后我這邊做題的代碼也是個(gè)人理解使用,有錯(cuò)誤歡迎大家批評(píng)指正,祝大家學(xué)習(xí)愉快~
代碼鏈接:
https://github.com/suisuisi/SystemVerilog/tree/main/SystemVerilogHDLBits
審核編輯 :李倩
-
鎖存器
+關(guān)注
關(guān)注
8文章
907瀏覽量
41568 -
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2002瀏覽量
61267 -
代碼
+關(guān)注
關(guān)注
30文章
4813瀏覽量
68845
原文標(biāo)題:總結(jié)
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論