FPGA學習筆記(七) BCD計數器

2021-10-23 15:55:26 字數 3995 閱讀 3417

激勵檔案

需要注意

//時序變組合 去掉reg

output [3:

0] q;

reg [3:

0] cnt;

always @ (posedge clk or negedge rst_n)if(

!rst_n)

cnt <=

4'd0;

else

if(cin ==

1'b1)begin

if(cnt ==

4'd9)

cnt <=

4'b0;

else

cnt <= cnt +

1'b1;

endelse

cnt <= cnt;

//產生進製輸出訊號

//時序邏輯有延遲

/*always @ (posedge clk or negedge rst_n)

if(!rst_n)

cout <= 1'b0;

else if(cin == 1'b1 && cnt == 4'd9)

cout <= 1'b1;

else

cout <= 1'b0;

if(cin == 1'b1 && cnt == 4'd9)

*///產生進製輸出訊號

//assign cout = (cin == 1'b1 && cnt == 4'd9)?1'b1:1'b0; //兩種皆可

assign cout =

(cin ==

1'b1 && cnt == 4'd9)

;assign q = cnt ;

endmodule

module	my_bcd_counter_top	(clk,cin,rst_n,cout,q)

; input clk,cin,rst_n;

output cout;

//不賦值,直接輸出 去掉reg

output [11:

0] q;

wire cout0,cout1;

wire [3:

0] q0,q1,q2;

assign q=

;//拼接

my_bcd_counter my_bcd_counter0

(.clk (clk)

,.cin (cin)

,.rst_n (rst_n)

,.cout (cout0)

,.q (q0));

my_bcd_counter my_bcd_counter1

(.clk (clk)

,.cin (cout0)

,.rst_n (rst_n)

,.cout (cout1)

,.q (q1));

my_bcd_counter my_bcd_counter2

(.clk (clk)

,.cin (cout1)

,.rst_n (rst_n)

,.cout (cout)

,.q (q2));

endmodule

`timescale 1ns/

1ns`define clock_period 20

module my_bcd_counter_tb;

reg clk,cin,rst_n;

//激勵訊號

wire cout;

//輸出訊號

wire [3:

0] q;

my_bcd_counter my_bcd_counter0

(.clk (clk)

,.cin (cin)

,.rst_n (rst_n)

,.cout (cout)

,.q (q));

//t=20ns 給激勵訊號

initial clk =

1'b1;

always #(`clock_period /

2) clk =

~clk;

initial begin

rst_n =

1'b0;

//初始態

cin =

1'b0;

#(`clock_period *

200)

; rst_n =

1'b1;

#(`clock_period *20)

;repeat(30

)begin

cin =

1'b1;

#`clock_period ;

cin =

1'b0;

#(`clock_period *5)

; end

#(`clock_period *5)

; $stop;

endendmodule

`timescale 1ns/

1ns`define clock_period 20

module my_bcd_counter_top_tb;

reg clk,cin,rst_n;

//激勵訊號

wire cout;

//輸出訊號

wire [11:

0] q;

my_bcd_counter_top my_bcd_counter_top0

(.clk (clk)

,.cin (cin)

,.rst_n (rst_n)

,.cout (cout)

,.q (q));

//t=20ns 給激勵訊號

initial clk =

1'b1;

always #(`clock_period /

2) clk =

~clk;

initial begin

rst_n =

1'b0;

//初始態

cin =

1'b0;

#(`clock_period *

200)

;//4000ns

rst_n =

1'b1;

#(`clock_period *20)

;//4400ns

cin =

1'b1;

#(`clock_period *

5000);

//10_4400ns

$stop;

endendmodule

1>.時序邏輯有時鐘的延遲,時鐘上公升沿觸發一次。

always @ (posedge clk or negedge rst_n)

if(!rst_n)

cout <= 1'b0;

else if(cin == 1'b1 && cnt == 4'd9)

cout <= 1'b1;

else

cout <= 1'b0;

2>.組合邏輯無時鐘延遲

//產生進製輸出訊號	

//assign cout = (cin == 1'b1 && cnt == 4'd9)?1'b1:1'b0; //兩種皆可

使用Verilog實現FPGA計數器功能

編寫veriloghdl 程式,實現如下功能 利用開發板上的數碼顯示解碼器設計乙個十進位制計數器,要求該計數器具有以下功能 1.計數範圍為 0 20 計算到 20時自動清零,計數間隔時間為1s 2.具有按鍵非同步 同步清零功能 1.用乙個時鐘脈衝,分出兩個頻率,乙個為計數頻率,乙個為掃瞄頻率。2.利...

使用Verilog實現FPGA計數器功能

編寫veriloghdl 程式,實現如下功能 利用開發板上的數碼顯示解碼器設計乙個十進位制計數器,要求該計數器具有以下功能 1.計數範圍為 0 20 計算到 20時自動清零,計數間隔時間為1s 2.具有按鍵非同步 同步清零功能 1.用乙個時鐘脈衝,分出兩個頻率,乙個為計數頻率,乙個為掃瞄頻率。2.利...

Hadoop計數器與自定義計數器(筆記7)

計數器 計數器是用來記錄job的執行進度和狀態的。它的作用可以理解為日誌。我們通常可以在程式的某個位置插入計數器,用來記錄資料或者進度的變化情況,它比日誌更便利進行分析。例如,我們有乙個檔案,其中包含如下內容 hello you hello me 它被wordcount程式執行後顯示如下日誌 在上圖...