Verilog設計流水燈(分頻)

2021-10-12 07:56:13 字數 3181 閱讀 3502

在開發板中,有乙個內建的時鐘週期,為100mhz,我們需要使用這樣乙個時鐘訊號來設計乙個1hz的流水燈(使用8個led燈),也就是一秒鐘有乙個燈是亮起的,依次從左到右。

另外還有乙個低有效的復位使能端、乙個同步保持使能(有效時流水燈亮起狀況不變)

首先,1hz和100mhz的時鐘週期需要進行轉換,然後利用新的時鐘訊號進行led燈訊號變更即可。

分頻部分

思路是這樣的,既然是100mhz,也就是10-8s的時鐘週期,那麼我們就需要進行計數,當計數到108時,才是乙個新的時鐘訊號的乙個週期;但是我們知道時鐘訊號是會有乙個高低電平翻轉的,也就是說當計數到108的一半時,需要有乙個訊號翻轉。

**:

`timescale 1ns /

1psmodule divider

( input rst_n_i,

//乙個低有效的復位使能

input clk_i,

output reg clk_o

); reg [28:

0]cnt = 'b0;

always@(posedge clk_i or negedge rst_n_i) begin

if(rst_n_i ==

1'b0)

//復位使能有效

cnt <= 'b0;

else

if(cnt ==

9999_9999)

//乙個週期

cnt <= 'b000;

else

//計數器遞增

cnt <= cnt +

1'b1;

if(cnt <=

4999_9999 && rst_n_i)

//翻轉

clk_o <=

1'b1;

else

clk_o <=

1'b0;

endendmodule

此時的clk_o訊號就是我們需要的1hz訊號了。

流水燈主部分:

利用新的時鐘訊號,設定乙個計數器來控制led燈中亮起的部分(其實屬於乙個38解碼器)

**:

`timescale 1ns /

1psmodule flowled

( input clk_i,

input rst_n_i,

//低有效

input en_i,

//高有效

output reg [7:

0]led

); reg [2:

0]middle='b000;

//中間變數計數器

always@(posedge clk_i or negedge rst_n_i) begin

if(rst_n_i ==

1'b0)

//復位使能

begin

middle <=

3'b000;

led <=

8'b0000_0000;

endelse

if(en_i ==

1'b0)

//保持使能

led <= led;

else

if(middle >= 'b111)

middle <=

1'b0;

else

middle <= middle +

1'b1;

case

(middle)

3'b000: led = 8'b0000_0001;

3'b001: led = 8'b0000_0010;

3'b010: led = 8'b0000_0100;

3'b011: led = 8'b0000_1000;

3'b100: led = 8'b0001_0000;

3'b101: led = 8'b0010_0000;

3'b110: led = 8'b0100_0000;

3'b111: led = 8'b1000_0000;

endcase

endendmodule

最後再提一下**的問題吧。

**檔案:

`timescale 1ns /

1psmodule flowled_top_sim()

; reg clk_i=

1'b1;

reg rst_i=

1'b1;

reg en_i=

1'b1;

wire [7:

0]led;

flowled_top out3

(clk_i,rst_i,en_i,led)

;//模組呼叫

always begin

#1 clk_i =

~clk_i;

//時鐘訊號翻轉

endinitial begin //initial語句一般是用於**檔案的,因為綜合不好過

#150 en_i =

1'b0;

#500 en_i =

1'b1;

#100 rst_i =

1'b0;

endendmodule

很明顯,如果真的是去嘗試用108來進行**驗證,是需要跑很久的,所以這裡給出乙個技巧,就是將原始碼中分頻的新時鐘訊號週期進行修改,這裡改為10。(注意下面兩個都需要修改

else

if(cnt ==9)

if(cnt <=

4&& rst_n_i)

//翻轉

clk_o <=

1'b1;

**波形:

如果我們希望看一下分頻模組中計數器變數的運**況,我們應該怎麼做?

這樣,我們就可以將中間變數進行新增了。

效果:

計算機組成 Verilog流水燈實驗

基本上計算機專業應該都玩過的實驗。真的很有意思,不過當時劃了水。不過當時是和乙個夥伴一起做的,我們還額外新增了反轉功能等。led流水燈原理 讓二極體形成流水燈,即先點亮乙個led燈,等待一小段時間後熄滅 再讓第二個led燈點亮,過一小段時間後再熄滅 以此類推,當最後乙個led燈點亮後,過一小段時間後...

Verilog 時鐘偶分頻 奇分頻 任意分頻

分頻器是指使輸出訊號頻率為輸入訊號頻率整數分之一的電子電路。偶分頻計數器 偶分頻比較簡單,假設為n分頻,只需計數到n 2 1,然後時鐘翻轉 計數清零,如此迴圈就可以得到n 偶 分頻。如下 module even divider clk in,rst n,even en,偶分頻使能訊號,方便後續設計任...

呼吸流水燈

實現剛開始第乙個燈做完呼吸後左移,到達最右邊後回來,如此反覆。由於 需求,在每個計數器到達最大時設定乙個標誌位便於觀察。分析 的編寫 module xunhuan1 input wire clk input wire rst n output reg 3 0 led reg 5 0 cnt us r...