設(shè)計(jì)原理:
在以后的設(shè)計(jì)中,用的開(kāi)發(fā)板都將是我們至芯科技自主設(shè)計(jì)的開(kāi)發(fā)板,我們的芯片用的是Cyclone4系列的EP4CE10F17C8,在以后的設(shè)計(jì)中我們將不再討論我們的開(kāi)發(fā)板
今天的設(shè)計(jì)是流水燈,在單片機(jī)中我們也了解到流水燈的點(diǎn)亮,不就是高電平或者低電平亮或者滅,然后通過(guò)依次的點(diǎn)亮LED燈,就形成了流水我們用的開(kāi)發(fā)板的電路圖如下
在點(diǎn)圖中我們可以了解到我們的點(diǎn)亮電路,幾個(gè)燈都是公用的是高電平也就是3.3V,所以只要給一個(gè)低電平就可以點(diǎn)亮我們的流水燈我們的開(kāi)發(fā)板提供的晶振是50M的,50M一個(gè)周期是20ns。
我們?nèi)搜勰軌蚍直娴牡乃俣仁?5ms左右,也就是物體如果45ms移動(dòng)一次我們看清它是停一下走一下的,如果快于這個(gè)時(shí)間的話,那么我們看到的物體的移動(dòng)就是連貫的。
我們要設(shè)計(jì)出人眼可以分辨的流水就需要我們?cè)O(shè)計(jì)出大于這個(gè)時(shí)間燈亮滅,然后形成人眼可以分辨的流水。
本次我們的設(shè)計(jì)流水燈的流水時(shí)間是1s,那么我們就需要一個(gè)時(shí)間寄存器,當(dāng)計(jì)數(shù)到1s的時(shí)候我們點(diǎn)亮一個(gè)燈,等下一個(gè)1s來(lái)的時(shí)候,我們點(diǎn)亮下一個(gè)等。
然后形成流水,50M是20ns,1s是1hz,那么我們需要計(jì)數(shù)50 000 000值得提的是我們算計(jì)數(shù)的時(shí)間是一面的等式 :計(jì)數(shù) = 晶振 / 需要的頻率 ,計(jì)數(shù)的時(shí)間就是我們1hz的周期。
那么計(jì)數(shù)到一半的時(shí)候就是半個(gè)周期,我們可以在計(jì)數(shù)一半的時(shí)候clk 翻轉(zhuǎn),那么當(dāng)技計(jì)數(shù)到的時(shí)候就是占空比50%的1hz的周期
設(shè)計(jì)架構(gòu)圖:
設(shè)計(jì)代碼:
設(shè)計(jì)模塊
0 module led_run (clk, rst_n, led);
1
2 input clk, rst_n;
3
4 output reg [3:0] led;
5
6 reg [25:0] count;
7 reg clk_1hz;
8
9 always @ (posedge clk)
10 if(!rst_n)
11 begin
12 clk_1hz <= 1;
13 count <= 0;
14 end
15 else if(count < (50_000_000 / 1 / 2 - 1)) //計(jì)數(shù)
16 count <= count 1'd1;
17 else
18 begin //當(dāng)計(jì)數(shù)到的時(shí)候,得到1hz的時(shí)鐘
19 count <= 26'd0;
20 clk_1hz <= ~ clk_1hz; //~時(shí)鐘翻轉(zhuǎn)
21 end
22
23 always @ (posedge clk_1hz)
24 if(!rst_n)
25 led <= 4'b0111; //復(fù)位點(diǎn)亮第四個(gè)燈,熄滅1 2 3 燈
26 else
27 led <= {led[0],led[3:1]}; //當(dāng)時(shí)鐘上升沿來(lái)的時(shí)候把led的第一位 放在
28 //第四位,2 -- 4位放在 3 -- 1位,依次的移位,也就是把復(fù)位中的低電平 不停的
29 //移動(dòng)在4 --1 位之中的某一位,從而實(shí)現(xiàn)流水
30 endmodule
測(cè)試模塊
0 `timescale 1ns/1ps
1
2 module tb();
3
4 reg clk, rst_n; //定義模塊的端口
5 wire [3:0] led;
6
7 initial begin
8
9 clk = 1;
10 rst_n = 0;
11
12 #200.1 rst_n = 1;
13
14 #20000 $stop; //延遲20000 Ns后 停止計(jì)數(shù)
15
16 end
17
18 always #10 clk = ~clk; //產(chǎn)生一個(gè)50M的時(shí)鐘
19
20 led_run dut( //例化設(shè)計(jì)模塊
21 .clk(clk),
22 .rst_n(rst_n),
23 .led(led)
24 );
25
26 endmodule
仿真圖:
在仿真中我們可以調(diào)下我們?cè)O(shè)計(jì)模塊的中的計(jì)數(shù)值,這樣在仿真中我們可以我們可以快速的等到仿真結(jié)果,要不然你仿真幾個(gè)小時(shí)可能才會(huì)出結(jié)果。
在仿真中我們可以可以看到在我們的1hz時(shí)鐘的上升沿,我們led的4位中的一位將有一位變化為0,從而實(shí)現(xiàn)流水。
聯(lián)系客服