在開發板中,有乙個內建的時鐘週期,為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...