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