從今天開始新的一章-時序電路,包括觸發(fā)器、計數(shù)器、移位寄存器、狀態(tài)機(jī)等。
今天更新計數(shù)器,這也是FPGA部分非常重要的設(shè)計技巧。
Problem 98-Count15
題目說明
構(gòu)建一個4位二進(jìn)制計數(shù)器,計數(shù)范圍從0到15(包括0和15),計數(shù)周期為16。同步復(fù)位輸入時,將計數(shù)器重置為0。

圖片來自HDLBits
模塊端口聲明
moduletop_module( inputclk, inputreset,//Synchronousactive-highreset output[3:0]q);
題目解析
這是一個基本計數(shù)器。同步復(fù)位情況下,復(fù)位不放在敏感列表里。
moduletop_module( inputlogicclk, inputlogicreset,//Synchronousactive-highreset outputlogic[3:0]q); always_ff@(posedgeclk)begin if(reset)q<=?'0?; ????????else?if(q?==?4'd15)?q?<=?'0?; ????????else??q?<=?q?+?1?; ????end ???????????? endmodule

點(diǎn)擊Submit,等待一會就能看到下圖結(jié)果:

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會對比這兩個波形,一旦這兩者不匹配,仿真結(jié)果會變紅。
這一題就結(jié)束了。
Problem 99-Count10
題目說明
構(gòu)建一個十進(jìn)制計數(shù)器,從0到9(包括0和9)計數(shù),計數(shù)周期為10。同步復(fù)位輸入時,將計數(shù)器重置為0。

圖片來自HDLBits
模塊端口聲明
moduletop_module( inputclk, inputreset,//Synchronousactive-highreset output[3:0]q);
題目解析
和上一題類似。
moduletop_module( inputlogicclk, inputlogicreset,//Synchronousactive-highreset outputlogic[3:0]q); always_ff@(posedgeclk)begin if(reset)q<=?'0?; ????????else?if(q?==?4'd9)??q?<=?'0?; ????????else????????????????q?<=?q?+?1; ????end ? endmodule

點(diǎn)擊Submit,等待一會就能看到下圖結(jié)果:

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會對比這兩個波形,一旦這兩者不匹配,仿真結(jié)果會變紅。
這一題就結(jié)束了。
Problem 100-Count1to10
題目說明
做一個十進(jìn)制計數(shù)器,從1到10(包括1和10)計數(shù),計數(shù)周期為10。同步復(fù)位輸入時,將計數(shù)器重置為1。

圖片來自HDLBits
模塊端口聲明
moduletop_module( inputclk, inputreset, output[3:0]q);
題目解析
和上一節(jié)一樣,上一節(jié)是從0到9,這題從1到10,計數(shù)結(jié)束條件和重置條件不一樣,其他一樣。
moduletop_module( inputlogicclk, inputlogicreset, outputlogic[3:0]q); always_ff@(posedgeclk)begin if(reset)q<=?4'd1; ????????else?if(q?==?4'd10)?q?<=?4'd1; ????????else????????????????q?<=?q?+?1; ????end endmodule

點(diǎn)擊Submit,等待一會就能看到下圖結(jié)果:

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會對比這兩個波形,一旦這兩者不匹配,仿真結(jié)果會變紅。
這一題就結(jié)束了。
Problem 101-Countslow
題目說明
構(gòu)建一個十進(jìn)制計數(shù)器,從0到9(包括0和9)計數(shù),計數(shù)周期為10。同步復(fù)位輸入時,將計數(shù)器重置為0。但是本題是希望該計數(shù)器并不是隨著clk的變化而遞增,而是隨著一個slowena使能信號來控制增加。時序圖如下圖所示:

圖片來自HDLBits
模塊端口聲明
moduletop_module( inputclk, inputslowena, inputreset, output[3:0]q);
題目解析
本題相比于之前的計數(shù)器,不同點(diǎn)在于多了一個enable信號來控制計數(shù)器的增加(這應(yīng)該叫使能同步計數(shù)器(戰(zhàn)術(shù)后仰))。
moduletop_module( inputlogicclk, inputlogicslowena, inputlogicreset, outputlogic[3:0]q); always_ff@(posedgeclk)begin if(reset)q<=?'0?; ????????else?if(slowena?&?q==4'd9)?q?<=?'0?; ????????else?if(slowena?&?q!=4'd9)?q?<=?q?+?1?; ????????else???????????????????????q?<=?q??; ????end endmodule

點(diǎn)擊Submit,等待一會就能看到下圖結(jié)果:

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會對比這兩個波形,一旦這兩者不匹配,仿真結(jié)果會變紅。
這一題就結(jié)束了。
Problem 102-ece241_2014_q7a
題目說明
根據(jù)以下輸入輸出信號設(shè)計一個計算1~12的計數(shù)器
Reset:同步復(fù)位信號,高復(fù)位,將計數(shù)器復(fù)位為1.
Enable:使能信號高有效
Clk:時鐘上升沿觸發(fā)計數(shù)器工作
Q[3:0]:計數(shù)器輸出
c_enable, c_load, c_d[3:0]:題目中給我們提供了一個4-bit的計數(shù)器,這三個信號是用于該4-bit計數(shù)器的控制信號。
題目提供給我們4-bit計數(shù)器
有enable信號,帶復(fù)位和置位的計數(shù)器,將該計數(shù)器例化至我們的代碼中。
再用一些其他的邏輯門來完成本題
//題目提供的4-bit計數(shù)器代碼 modulecount4( inputclk, inputenable, inputload, input[3:0]d, outputreg[3:0]Q );
模塊端口聲明
moduletop_module( inputclk, inputreset, inputenable, output[3:0]Q, outputc_enable, outputc_load, output[3:0]c_d );
題目解析
本題相當(dāng)于用c_enale、c_load和c_d[3:0]三個控制信號來控制題目中給我們提供的4-bit計數(shù)器,使得該計數(shù)器的技術(shù)范圍改變?yōu)?~12.
moduletop_module( inputlogicclk, inputlogicreset, inputlogicenable, outputlogic[3:0]Q, outputlogicc_enable, outputlogicc_load, outputlogic[3:0]c_d );// count4u1_count4(clk,c_enable,c_load,c_d,Q); assignc_enable=enable; assignc_load=reset|((Q==4'd12)&&enable); assignc_d=c_load?4'd1:4'd0; endmodule

點(diǎn)擊Submit,等待一會就能看到下圖結(jié)果:

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會對比這兩個波形,一旦這兩者不匹配,仿真結(jié)果會變紅。
這一題就結(jié)束了。
Problem 103-ece241_2014_q7b
題目說明
從1000Hz中分離出1Hz的信號,叫做OneHertz。這個主要用作與數(shù)字時鐘中。利用一個模10的BCD計數(shù)器和盡量少的邏輯門來建立一個時鐘分頻器。同時輸出每個BCD計算器的使能信號(c_enable[0]為高位,c_enable[2]為低位)。
題目已經(jīng)給我們提供了BCD計數(shù)器。Enable信號高有效。Reset信號高有效且復(fù)位為0。我們設(shè)計的電路中均要采用1000Hz的時鐘。
modulebcdcount( inputclk, inputreset, inputenable, outputreg[3:0]Q );
模塊端口聲明
moduletop_module( inputclk, inputreset, outputOneHertz, output[2:0]c_enable );
題目解析
題目已經(jīng)提供了一個模塊,但是是個模10的BCD計數(shù)器,1000Hz提取1Hz,那么需要3個上面的計數(shù)器(1000/10/10/10=1).
moduletop_module(
inputlogicclk,
inputlogicreset,
outputlogicOneHertz,
outputlogic[2:0]c_enable
);//
wirelogic[3:0]unit,ten,hundred;
assignc_enable={unit==4'd9&&ten==4'd9,unit==4'd9,1'b1};
assignOneHertz=(unit==4'd9&&ten==4'd9&&hundred==4'd9);
bcdcountcounter0(clk,reset,c_enable[0],unit);
bcdcountcounter1(clk,reset,c_enable[1],ten);
bcdcountcounter2(clk,reset,c_enable[2],hundred);
endmodule

點(diǎn)擊Submit,等待一會就能看到下圖結(jié)果:

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會對比這兩個波形,一旦這兩者不匹配,仿真結(jié)果會變紅。
這一題就結(jié)束了。
Problem 104-Countbcd
題目說明
構(gòu)建一個4位BCD(二進(jìn)制編碼十進(jìn)制)計數(shù)器。每個十進(jìn)制數(shù)字使用4位進(jìn)行編碼:q[3:0]是一位數(shù)字,q[7:4]是十位數(shù)字,等等。對于ena[3:1],該信號用來表示個位、十位和百位的進(jìn)位。時序圖如下圖所示:

圖片來自HDLBits
模塊端口聲明
moduletop_module( inputclk, inputreset,//Synchronousactive-highreset output[3:1]ena, output[15:0]q);
題目解析
這是一個數(shù)字時鐘的一部分。
moduletop_module(
inputlogicclk,
inputlogicreset,//Synchronousactive-highreset
outputlogic[3:1]ena,
outputlogic[15:0]q);
reg[3:0]ones;
reg[3:0]tens;
reg[3:0]hundreds;
reg[3:0]thousands;
always@(posedgeclk)begin
if(reset)ones<=?4'd0;
????????else?if(ones?==?4'd9)???ones?<=?4'd0;
????????else????????????????????ones?<=?ones?+?4'd1?;
????end
????
????always@(posedge?clk)begin
????????if(reset)???????????????tens?<=?4'd0;
????????????
????????else?if(tens?==?4'd9?&&?ones?==?4'd9)??
????????????????????????????????tens?<=?4'd0;
????????else?if(ones?==?4'd9)???tens?<=?tens?+?4'd1;
????end
????
????always@(posedge?clk)begin
????????if(reset)???????????????hundreds?<=?4'd0;
????????????
????????else?if(hundreds?==?4'd9?&&?tens?==?4'd9?&&?ones?==?4'd9)
????????????????????????????????hundreds?<=?4'd0;
????????else?if(tens?==?4'd9?&&?ones?==?4'd9)?
????????????????????????????????hundreds?<=?hundreds?+?4'd1;
????end
????
????always@(posedge?clk)begin
????????if(reset)???????????????thousands?<=?4'd0;
????????else?if(thousands?==?4'd9?&&?hundreds?==?4'd9?&&?tens?==?4'd9?&&?ones?==?4'd9)
????????????????????????????????thousands?<=?4'd0;
????????else?if(hundreds?==?4'd9?&&?tens?==?4'd9?&&?ones?==?4'd9)?
????????????????????????????????thousands?<=?thousands?+?4'd1;
????end
????
????assign?q?=?{thousands,?hundreds,?tens,?ones};
????assign?ena[1]?=?(ones?==?4'd9)???1'b1?:?1'b0;
????assign?ena[2]?=?(tens?==?4'd9?&&?ones?==?4'd9)???1'b1?:?1'b0;
????assign?ena[3]?=?(hundreds?==?4'd9?&&?tens?==?4'd9?&&?ones?==?4'd9)???1'b1?:?1'b0;
?
endmodule

點(diǎn)擊Submit,等待一會就能看到下圖結(jié)果:

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會對比這兩個波形,一旦這兩者不匹配,仿真結(jié)果會變紅。
這一題就結(jié)束了。
Problem 105-Count_clock
題目說明
用計數(shù)器設(shè)計一個帶am/pm的12小時時鐘。該計數(shù)器通過一個CLK進(jìn)行計時,用ena使能信號來驅(qū)動時鐘的遞增。
reset信號將時鐘復(fù)位為12:00 AM。 信號pm為0代表AM,為1代表PM。hh、mm和ss由兩個BCD計數(shù)器構(gòu)成hours(01~12), minutes(00~59) , second(00~59)。Reset信號比enable信號有更高的優(yōu)先級,即使沒有enable信號也可以進(jìn)行復(fù)位操作。
下圖所示的時序圖給出了從1159 AM 到12 :00 : 00 PM的變化。

圖片來自HDLBits
模塊端口聲明
moduletop_module( inputclk, inputreset, inputena, outputpm, output[7:0]hh, output[7:0]mm, output[7:0]ss);
題目解析
moduletop_module(
inputlogicclk,
inputlogicreset,
inputlogicena,
outputlogicpm,
outputlogic[7:0]hh,
outputlogic[7:0]mm,
outputlogic[7:0]ss);
//ssvar
varlogic[3:0]ss_one,ss_ten;
varlogicena_ss_one,ena_ss_ten;
varlogicrst_ss_one,rst_ss_ten;
//mmvar
varlogic[3:0]mm_one,mm_ten;
varlogicena_mm_one,ena_mm_ten;
varlogicrst_mm_one,rst_mm_ten;
//hhvar
varlogic[3:0]hh_one,hh_ten;
varlogicena_hh_one,ena_hh_ten;
varlogicrst_hh_one_0,rst_hh_one_1,rst_hh_ten_0,rst_hh_ten_1;
//pmvar
varlogicrev_pm;
//sscoutpart
assignena_ss_one=ena;
assignrst_ss_one=ena_ss_one&&(ss_one==4'd9);
always_ff@(posedgeclk)begin
if(reset)ss_one<=?'0?;
????????else?if(ena_ss_one)?begin
????????????if(rst_ss_one)??ss_one?<=?'0?;
????????????else????????????ss_one?<=?ss_one?+?4'd1?;
????????end
????end
????
????assign?ena_ss_ten?=?rst_ss_one?;
????assign?rst_ss_ten?=?ena_ss_ten?&&?(ss_ten?==?4'd5)?;
????
????always_ff@(posedge?clk)?begin
????????if(reset)???????????ss_ten?<=?'0?;
????????else?if(ena_ss_ten)?begin
????????????if(rst_ss_ten)??ss_ten?<=?'0?;
????????????else????????????ss_ten?<=?ss_ten?+?4'd1?;
????????end
????end
???
????
????//mm?cout?part
????
????assign?ena_mm_one?=?rst_ss_ten?;
????assign?rst_mm_one?=?ena_mm_one?&&?(mm_one?==?4'd9)?;
???????
????always_ff@(posedge?clk)?begin
????????if(reset)???????????mm_one?<=?'0?;
????????else?if(ena_mm_one)?begin
????????????if(rst_mm_one)??mm_one?<=?'0?;
????????????else????????????mm_one?<=?mm_one?+?4'd1?;
????????end
????end?
????
????
????assign?ena_mm_ten?=?rst_mm_one?;
????assign?rst_mm_ten?=?ena_mm_ten?&&?(mm_ten?==?4'd5)?;
????
????always_ff@(posedge?clk)?begin
????????if(reset)???????????mm_ten?<=?'0?;
????????else?if(ena_mm_ten)?begin
????????????if(rst_mm_ten)??mm_ten?<=?'0?;
????????????else????????????mm_ten?<=?mm_ten?+?4'd1?;
????????end
????end
????
????//hh?cout?part
????
????assign?ena_hh_one?=?rst_mm_ten?;
????assign?rst_hh_one_0?=?ena_hh_one?&&?(hh_one?==?4'd9)?;
????assign?rst_hh_one_1?=?ena_hh_one?&&?(hh_one?==?4'd2?&&?hh_ten?==?4'd1)?;
????
????always_ff@(posedge?clk)?begin
????????if(reset)?????????????hh_one?<=?4'd2?;
????????else?if(ena_hh_one)?begin
????????????if(rst_hh_one_0)??hh_one?<=?4'd0?;
????????????else?if(rst_hh_one_1)???????????
??????????????????????????????hh_one?<=?4'd1?;
????????????else??????????????hh_one?<=?hh_one?+?4'd1?;
????????end
????end?
????
????
????assign?ena_hh_ten?=?ena_hh_one?;
????assign?rst_hh_ten_0?=?ena_hh_ten?&&?(hh_one?==?4'd2?&&?hh_ten?==?4'd1)?;
????assign?rst_hh_ten_1?=?ena_hh_ten?&&?(hh_one?==?4'd9)?;
????
????always_ff@(posedge?clk)?begin
????????if(reset)?????????????hh_ten?<=?4'd1?;
????????else?if(ena_hh_ten)?begin
????????????if(rst_hh_ten_0)??hh_ten?<=?4'd0?;
????????????else?if(rst_hh_ten_1)????????????
??????????????????????????????hh_ten?<=?4'd1?;
????????end
????end
????
????
????//pm?display?part
????
????assign?rev_pm?=?(hh_ten?==?4'd1)?&&?(hh_one?==?4'd1)?&&?ena_hh_one?;
????
????always_ff@(posedge?clk)?begin
????????if(reset)???????pm?<=?'0??;
????????else?if(rev_pm)?pm?<=?~pm?;
????end
????
????//assign?time?output
????
????assign?ss?=?{ss_ten,ss_one}?;
????assign?mm?=?{mm_ten,mm_one}?;
????assign?hh?=?{hh_ten,hh_one}?;
endmodule



點(diǎn)擊Submit,等待一會就能看到下圖結(jié)果:

注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網(wǎng)站會對比這兩個波形,一旦這兩者不匹配,仿真結(jié)果會變紅。
這一題就結(jié)束了。
總結(jié)
今天的幾道題就結(jié)束了,對于計數(shù)器的設(shè)計真的需要掌握,不僅是時序電路的基礎(chǔ),同時在后續(xù)FPGA設(shè)計也是一個重要的設(shè)計技巧。
最后我這邊做題的代碼也是個人理解使用,有錯誤歡迎大家批評指正,祝大家學(xué)習(xí)愉快~
審核編輯:劉清
-
二進(jìn)制
+關(guān)注
關(guān)注
2文章
808瀏覽量
42732 -
計數(shù)器
+關(guān)注
關(guān)注
32文章
2303瀏覽量
97332 -
時序電路
+關(guān)注
關(guān)注
1文章
114瀏覽量
22142 -
CLK
+關(guān)注
關(guān)注
0文章
132瀏覽量
17901 -
Verilog語言
+關(guān)注
關(guān)注
0文章
113瀏覽量
8707
原文標(biāo)題:HDLBits: 在線學(xué)習(xí) SystemVerilog(十六)-Problem 98-105(計數(shù)器)
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
同步二進(jìn)制計數(shù)器
什么是二進(jìn)制計數(shù)器,二進(jìn)制計數(shù)器原理是什么?
構(gòu)建LED二進(jìn)制計數(shù)器
使用Arduino UNO構(gòu)建4位二進(jìn)制計數(shù)器
同步4位十進(jìn)制和二進(jìn)制計數(shù)器數(shù)據(jù)表
雙4位十進(jìn)制和二進(jìn)制計數(shù)器數(shù)據(jù)表
同步4位上/下二進(jìn)制計數(shù)器數(shù)據(jù)表
同步4位二進(jìn)制計數(shù)器數(shù)據(jù)表
二進(jìn)制串行計數(shù)器工作原理是什么?
十進(jìn)制和4位二進(jìn)制計數(shù)器數(shù)據(jù)表

構(gòu)建一個4位二進(jìn)制計數(shù)器
評論