常見計(jì)數(shù)器的verilog實(shí)現(xiàn)
掃描二維碼
隨時隨地手機(jī)看文章
第一種:
rtl可綜合電路
//**************************************************************************// *** 名稱 : count.v// *** 作者 : 南明離火hk// *** 博客 : https://www.cnblogs.com/jing-shui-liu-shen/// *** 日期 : 2021-07-08// *** 描述 : 計(jì)數(shù)器模塊//**************************************************************************module count (clk,rst_n,led) ; input clk ; //輸入50M的時鐘 input rst_n ; //輸入復(fù)位信號 output reg led ; //輸出ied信號 reg [1:0] cnt ; //定義變量cnt的數(shù)據(jù)類型和數(shù)據(jù)位//--------------------------------------------------------------- // 計(jì)數(shù)模塊//---------------------------------------------------------------always@(posedge clk or negedge rst_n) begin if(!rst_n) //復(fù)位信號拉低 cnt <= 2'b0; //復(fù)位時,變量cnt置為0 else if(cnt==3) //當(dāng)變量cnt為3時 cnt <= 2'b0; //變量cnt置為0 else //其它情況 cnt <= cnt + 2'b1; //變量cnt+1end//--------------------------------------------------------------- // led模塊//---------------------------------------------------------------always@(posedge clk or negedge rst_n) begin if(!rst_n) //復(fù)位信號拉低 led <= 1'b0; //復(fù)位時,變量led置為0 else if(cnt==2'd3) //當(dāng)變量cnt為3時 led <= 1'b1; //變量led置為1 else //其它情況 led <= 1'b0; //變量led置為1endendmodule
testbench
//**************************************************************************// *** 名稱 : count_tb.v// *** 作者 : 南明離火hk// *** 博客 : https://www.cnblogs.com/jing-shui-liu-shen/// *** 日期 : 2021-07-08// *** 描述 : 計(jì)數(shù)器仿真模塊//**************************************************************************`timescale 1ns/1ps //·timescale 定義仿真時間單位與精度,1ns是時間單位,即在仿真中用#10表示延遲10ns //1ps表示時間精度,比如你寫 #3.5547968525 a <= 1;c <= 1;,那么它時間精度也只會有1ps(即在3.555ns時賦值語句便生效)。`define clock_period 20 //時鐘周期為20ns,也就是頻率為50MHzmodule count_tb; //在testbench中,輸入都是要自己定義的,所以輸入信號都是reg,而輸出則是wire信號 reg clk; //定義reg型的clk reg rst_n; //定義reg型的rst_n wire led; //定義wire型的rst_n count u_count( //把寫好的計(jì)數(shù)器模塊例化進(jìn)來 .clk(clk), .rst_n(rst_n), .led(led) ); initial clk = 1; //定義clk信號的初始值為1 always #(`clock_period/2) clk = ~clk; //每隔半個時鐘周期,clk的值變化一次 initial begin rst_n = 1'b0; //一開始,令復(fù)位信號rst_n拉低,表示復(fù)位狀態(tài)有效 #(`clock_period *10); //經(jīng)過10個時鐘周期之后 rst_n = 1'b1; //令復(fù)位信號rst_n拉高,表示復(fù)位狀態(tài)無效 #(`clock_period *10); //經(jīng)過10個時鐘周期之后 $stop; //停止 end endmodule
對應(yīng)的modesim仿真
第二種:
rtl可綜合電路
//**************************************************************************// *** 名稱 : count.v// *** 作者 : 南明離火hk// *** 博客 : https://www.cnblogs.com/jing-shui-liu-shen/// *** 日期 : 2021-07-08// *** 描述 : 計(jì)數(shù)器模塊//**************************************************************************module count (clk,rst_n,led) ; input clk ; //輸入50M的時鐘 input rst_n ; //輸入復(fù)位信號 output reg led ; //輸出ied信號 reg [2:0] cnt ; //定義變量cnt的數(shù)據(jù)類型和數(shù)據(jù)位寬//--------------------------------------------------------------- // 計(jì)數(shù)模塊//---------------------------------------------------------------always@(posedge clk or negedge rst_n) begin if(!rst_n) //復(fù)位信號拉低 cnt <= 2'b0; //復(fù)位時,變量cnt置為0 else if(cnt==4) //當(dāng)變量cnt為4時 cnt <= 3'b1; //變量cnt置為1 else //其它情況 cnt <= cnt + 3'b1; //變量cnt+1end//--------------------------------------------------------------- // led模塊//---------------------------------------------------------------always@(posedge clk or negedge rst_n) begin if(!rst_n) //復(fù)位信號拉低 led <= 1'b0; //復(fù)位時,變量led置為0 else if(cnt==3'd4) //當(dāng)變量cnt為4時 led <= 1'b1; //變量led置為1 else //其它情況 led <= 1'b0; //變量led置為1endendmodule
testbench同第一種方法一樣。
對應(yīng)的modesim仿真
第三種:
//**************************************************************************// *** 名稱 : count.v// *** 作者 : 南明離火hk// *** 博客 : https://www.cnblogs.com/jing-shui-liu-shen/// *** 日期 : 2021-07-08// *** 描述 : 計(jì)數(shù)器模塊//**************************************************************************module count (clk,rst_n,led); input clk ; //輸入50M的時鐘 input rst_n ; //輸入復(fù)位信號 output led ; //輸出ied信號wire add_cnt ; //定義變量add_cnt的數(shù)據(jù)類型和數(shù)據(jù)位寬 wire end_cnt ; //定義變量end_cnt的數(shù)據(jù)類型和數(shù)據(jù)位寬reg [1:0]cnt ; //定義變量cnt的數(shù)據(jù)類型和數(shù)據(jù)位寬//--------------------------------------------------------------- // 計(jì)數(shù)模塊//---------------------------------------------------------------always@(posedge clk or negedge rst_n) begin if(!rst_n) //復(fù)位信號拉低 cnt <= 2'b0; //復(fù)位時,變量cnt置為0 else if(add_cnt) begin //當(dāng)add_cnt信號拉高時 if(end_cnt) //當(dāng)add_cnt信號拉高,end_cnt也拉高時 cnt <= 2'b0; //變量cnt置為0 else //當(dāng)add_cnt信號拉高,end_cnt拉低時 cnt <= cnt + 2'b1; //變量cnt+1 endendassign add_cnt = 1; //表示add_cnt信號一直處于拉高狀態(tài)assign end_cnt = add_cnt && cnt == 4-1; //表示當(dāng)add_cnt信號拉高,且cnt為4-1時,end_cnt拉高assign led = end_cnt; //表示將end_cnt信號直接連到led信號上,進(jìn)行輸出endmodule
testbench同第一種方法一樣。
對應(yīng)的modesim仿真
第四種:
rtl可綜合電路
//**************************************************************************// *** 名稱 : count.v// *** 作者 : 南明離火hk// *** 博客 : https://www.cnblogs.com/jing-shui-liu-shen/// *** 日期 : 2021-07-08// *** 描述 : 計(jì)數(shù)器模塊//**************************************************************************module count (clk,rst_n,led); input clk ; //輸入50M的時鐘 input rst_n ; //輸入復(fù)位信號 output led ; //輸出ied信號wire add_cnt ; //定義變量add_cnt的數(shù)據(jù)類型和數(shù)據(jù)位寬 wire end_cnt ; //定義變量end_cnt的數(shù)據(jù)類型和數(shù)據(jù)位寬reg [2:0]cnt ; //定義變量cnt的數(shù)據(jù)類型和數(shù)據(jù)位寬//--------------------------------------------------------------- // 計(jì)數(shù)模塊//---------------------------------------------------------------always@(posedge clk or negedge rst_n) begin if(!rst_n) //復(fù)位信號拉低 cnt <= 3'b0; //復(fù)位時,變量cnt置為0 else if(add_cnt) begin //當(dāng)add_cnt信號拉高時 if(end_cnt) //當(dāng)add_cnt信號拉高,end_cnt也拉高時 cnt <= 3'b1; //變量cnt置為1 else //當(dāng)add_cnt信號拉高,end_cnt拉低時 cnt <= cnt + 3'b1; //變量cnt+1 endendassign add_cnt = 1; //表示add_cnt信號一直處于拉高狀態(tài)assign end_cnt = add_cnt && cnt == 4; //表示當(dāng)add_cnt信號拉高,且cnt為4時,end_cnt拉高assign led = end_cnt; //表示將end_cnt信號直接連到led信號上,進(jìn)行輸出endmodule
testbench同第一種方法一樣。
對應(yīng)的modesim仿真
計(jì)數(shù)器就講這些了,最近高清壁紙快要用完了,如果網(wǎng)友們有相關(guān)資源,歡迎分享!





