設(shè)計原理: 在以后的設(shè)計中,用的開發(fā)板都將是我們至芯科技自主設(shè)計的開發(fā)板,,我們的芯片用的是Cyclone4系列的EP4CE10F17C8,,在以后的設(shè)計中我們將不再討論我們的開發(fā)板 今天的設(shè)計是流水燈,,在單片機(jī)中我們也了解到流水燈的點亮,不就是高電平或者低電平亮或者滅,,然后通過依次的點亮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è)計模塊 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)) //計數(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 @ (posedge clk_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)流水 30 endmodule 測試模塊 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后 停止計數(shù) 15 16 end 17 18 always #10 clk = ~clk; //產(chǎn)生一個50M的時鐘 19 20 led_run dut( //例化設(shè)計模塊 21 .clk(clk), 22 .rst_n(rst_n), 23 .led(led) 24 ); 25 26 endmodule 仿真圖: 在仿真中我們可以調(diào)下我們設(shè)計模塊的中的計數(shù)值,,這樣在仿真中我們可以我們可以快速的等到仿真結(jié)果,要不然你仿真幾個小時可能才會出結(jié)果,。
在仿真中我們可以可以看到在我們的1hz時鐘的上升沿,,我們led的4位中的一位將有一位變化為0,從而實現(xiàn)流水,。 |
|