HDLBits答案(11)_Verilog计数器
Verilog計數器
HDLBits鏈接
前言
今天更新一個小節(jié)內容:計數器。計數器可以說是我們接觸數字電路以后用的最頻繁的模塊之一了,無論是項目、應聘還是將來的工作,計數器都無處不在。
題庫
題目描述1:
構建一個從0到15的4位二進制計數器,周期為16。同步復位,復位應該將計數器重置為0。
Solution1:
module top_module (input clk,input reset, // Synchronous active-high resetoutput [3:0] q);always @(posedge clk)beginif(reset)beginq<=4'b0;endelse beginq<=q+1'b1;endendendmodule題目描述2:
構建一個從0到9(包括9)的十進制計數器,其周期為10。同步復位,復位應該將計數器重置為0。
Solution2:
module top_module (input clk,input reset, // Synchronous active-high resetoutput [3:0] q);always @(posedge clk)beginif(reset || q >= 4'd9)beginq<=4'b0;endelse beginq<=q+1'b1;endendendmodule題目描述3:
制作一個從1到10的10進制計數器。同步復位,復位應該將計數器復位為1。
Solution3:
module top_module (input clk,input reset,output [3:0] q);always @(posedge clk)beginif(reset || q>=4'd10)beginq<=4'b1;endelse beginq<=q+1'b1;endendendmodule題目描述4:
構建一個從0到9(包括9)的十進制計數器,其周期為10。同步復位,復位應該將計數器重置為0。我們希望能夠暫停計數器,而不是總是在每個時鐘周期中遞增,因此slowena輸入指示計數器應該何時遞增。
Solution4:
module top_module (input clk,input slowena,input reset,output [3:0] q);always @(posedge clk)beginif(reset)beginq<=4'b0;endelse if(slowena)beginif(q==4'd9)beginq<=4'b0;endelse beginq<=q+1'b1;endendendendmodule題目描述4:
設計一個1-12計數器
Solution4:
module top_module (input clk,input reset,input enable,output [3:0] Q,output c_enable,output c_load,output [3:0] c_d ); assign c_enable = enable;assign c_load = reset | ((Q == 4'd12) && (enable == 1'b1));assign c_d = c_load ? 4'd1 : 4'd0;count4 the_counter (clk, c_enable, c_load, c_d , Q);endmodule題目描述5:
例化BCD模塊實現降頻操作,1kHz->1Hz。
Solution5:
module top_module (input clk,input reset,output OneHertz,output [2:0] c_enable ); //wire[3:0] one, ten, hundred;assign c_enable = {one == 4'd9 && ten == 4'd9, one == 4'd9, 1'b1};assign OneHertz = (one == 4'd9 && ten == 4'd9 && hundred == 4'd9);bcdcount counter0 (clk, reset, c_enable[0], one);bcdcount counter1 (clk, reset, c_enable[1], ten);bcdcount counter2 (clk, reset, c_enable[2], hundred);endmodule題目描述6:
構建一個4位BCD(二進制編碼的十進制)計數器。每個十進制數字使用4位進行編碼:q[3:0]是個位,q[7:4]是十位,以此類推。各進制上的進位時也需輸出一個使能信號,指示三位數字何時應該增加。
Solution6:
module top_module (input clk,input reset, // Synchronous active-high resetoutput [3:1] ena,output [15:0] q);reg [3:0] ones;reg [3:0] tens;reg [3:0] hundreds;reg [3:0] thousands;always @(posedge clk) beginif(reset)beginones <= 4'b0;endelse if(ones == 4'd9)beginones <=4'b0;endelse beginones <= ones + 4'd1;endendalways @(posedge clk)beginif(reset)begintens <= 4'b0;endelse if(tens == 4'd9 && ones == 4'd9)begintens <= 4'b0;endelse if(ones == 4'd9)begintens <= tens + 4'd1;endendalways @(posedge clk)beginif(reset)beginhundreds <= 4'b0;endelse if(hundreds == 4'd9 && tens == 4'd9 && ones == 4'd9)beginhundreds <= 4'b0;endelse if(tens == 4'd9 && ones == 4'd9) beginhundreds <= hundreds + 4'd1;endendalways @(posedge clk)beginif(reset)beginthousands <= 4'b0;endelse if(thousands == 4'd9 && hundreds == 4'd9 && tens == 4'd9 && ones == 4'd9)beginthousands <= 4'b0;endelse if(hundreds == 4'd9 && tens == 4'd9 && ones == 4'd9)beginthousands <= thousands + 4'd1;endendassign q = {thousands,hundreds,tens,ones};assign ena[1] = (ones == 4'd9) ? 1'b1 : 1'b0;assign ena[2] = ((ones == 4'd9) && (tens == 4'd9)) ? 1'b1 : 1'b0;assign ena[3] = ((ones == 4'd9) && (tens == 4'd9) && (hundreds == 4'd9)) ? 1'b1 : 1'b0;endmodule題目描述7:
創(chuàng)建一組適合作為12小時的時鐘使用的計數器(帶有am/pm指示器)。你的計數器是由一個快速運行的clk驅動,每次時鐘增加時ena必須為1。reset將時鐘重置到中午12點。上午時pm=0,下午時pm=0。hh,mm和ss分別是小時(01-12)、分鐘(00-59)和秒(00-59)的兩個BCD(二進制編碼的十進制)數字。
Reset比enable具有更高的優(yōu)先級,并且即使在沒有啟用時也會發(fā)生。
下面的時序圖顯示了從11:59:59 AM到12:00:00 PM的翻轉行為以及同步的Reset和enable行為。
Solution7:
module top_module(input clk,input reset,input ena,output pm,output [7:0] hh,output [7:0] mm,output [7:0] ss); reg pm_temp;reg [3:0] ss_ones;reg [3:0] ss_tens;reg [3:0] mm_ones;reg [3:0] mm_tens;reg [3:0] hh_ones;reg [3:0] hh_tens;wire add_ss_ones;wire end_ss_ones;wire add_ss_tens;wire end_ss_tens;wire add_mm_ones;wire end_mm_ones;wire add_mm_tens;wire end_mm_tens;wire add_hh_ones;wire end_hh_ones_0;wire end_hh_ones_1;wire add_hh_tens;wire end_hh_tens_0;wire end_hh_tens_1;wire pm_ding;assign add_ss_ones = ena;assign end_ss_ones = add_ss_ones && (ss_ones == 4'd9);always @(posedge clk)beginif(reset)beginss_ones <= 4'b0;endelse if(add_ss_ones)beginif(end_ss_ones)beginss_ones <= 4'b0;endelse beginss_ones <= ss_ones + 4'b1;endendendassign add_ss_tens = end_ss_ones;assign end_ss_tens = add_ss_tens && (ss_tens == 4'd5);always @(posedge clk)beginif(reset)beginss_tens <= 4'b0;endelse if(add_ss_tens)beginif(end_ss_tens)beginss_tens <= 4'b0;endelse beginss_tens <= ss_tens + 4'b1;endendendassign add_mm_ones = end_ss_tens;assign end_mm_ones = add_mm_ones && (mm_ones == 4'd9);always @(posedge clk)beginif(reset)beginmm_ones <= 4'b0;endelse if(add_mm_ones)beginif(end_mm_ones)beginmm_ones <= 4'b0;endelse beginmm_ones <= mm_ones + 4'b1;endendendassign add_mm_tens = end_mm_ones;assign end_mm_tens = add_mm_tens && (mm_tens == 4'd5);always @(posedge clk)beginif(reset)beginmm_tens <= 4'b0;endelse if(add_mm_tens)beginif(end_mm_tens)beginmm_tens <= 4'b0;endelse beginmm_tens <= mm_tens + 4'b1;endendendassign add_hh_ones = end_mm_tens;assign end_hh_ones_0 = add_hh_ones && (hh_ones == 4'd9);assign end_hh_ones_1 = add_hh_ones && ((hh_ones == 4'd2) && (hh_tens == 4'd1));always @(posedge clk)beginif(reset)beginhh_ones <= 4'd2;endelse if(add_hh_ones)beginif(end_hh_ones_0)beginhh_ones <= 4'b0;endelse if(end_hh_ones_1)beginhh_ones <= 4'b1;endelse beginhh_ones <= hh_ones+4'b1;endendendassign add_hh_tens = end_mm_tens;assign end_hh_tens_0 = add_hh_tens && end_hh_ones_1;assign end_hh_tens_1 = add_hh_tens && end_hh_ones_0;always @(posedge clk)beginif(reset)beginhh_tens <= 4'b1;endelse if(add_hh_tens)beginif(end_hh_tens_0)beginhh_tens <= 4'b0;endelse if(end_hh_tens_1)beginhh_tens <= hh_tens + 4'b1;endendendalways@(posedge clk)beginif(reset)beginpm_temp <= 1'b0;endelse if(pm_ding)beginpm_temp <= ~pm_temp;endendassign pm_ding = hh_tens == 4'd1 && hh_ones == 4'd1 && end_mm_tens;assign ss = {ss_tens, ss_ones};assign mm = {mm_tens, mm_ones};assign hh = {hh_tens, hh_ones};assign pm = pm_temp;endmodule總結
- 熟悉了基本計數器的代碼編寫。
 - 時鐘的進位條件應單獨用assign列出,這樣層次感更加清晰。
 
總結
以上是生活随笔為你收集整理的HDLBits答案(11)_Verilog计数器的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Questasim10.6c下载与安装教
 - 下一篇: HDLBits答案(12)_Verilo