永远的流水灯(Verilog)
1. 為了更好地學(xué)習(xí)FPGA和深入理解Verilog語(yǔ)法,首先從最簡(jiǎn)單的流水燈做起。雖然簡(jiǎn)單,但是也包含了不少知識(shí)。通過(guò)這次實(shí)驗(yàn)項(xiàng)目,可以了解開發(fā)軟件的使用及Verilog的編程方法,熟悉模塊化設(shè)計(jì)的方法。
2. 該項(xiàng)目主要實(shí)現(xiàn)的功能為:
(1)10位的流水燈
(2)中間兩個(gè)led燈每隔100ms閃爍一次
(3)兩邊的led燈每隔100ms流動(dòng)一下,從中間向兩邊流水。
3. 具體實(shí)現(xiàn)如下
(1)首先定義一個(gè)時(shí)間計(jì)數(shù)寄存器counter,每當(dāng)達(dá)到預(yù)定的100ms時(shí),計(jì)數(shù)寄存器就清零,否則的話寄存器就加1。然后計(jì)算計(jì)數(shù)器計(jì)數(shù)的最大值。時(shí)鐘頻率為50MHZ,也就是周期為1/50M 為20ns,要計(jì)數(shù)的最大值為T100MS= 100ms/20ns-1 = 4999_999。
代碼實(shí)現(xiàn)為
always @ (posedge clk or negedge rst)
if(!rst) //高電平復(fù)位
counter<=25'd0;
else if(counter==T100ms)
counter<=25'd0;
else
counter<=counter+1'b1;
(2)如何控制led的亮滅呢,無(wú)非就是給端口賦高低電平,有的是高電平亮,有的是低電平亮,我用的FPGA學(xué)習(xí)板為高電平亮。每隔100ms對(duì)其端口值取反就可以實(shí)現(xiàn)閃爍的led
(3)流水燈的實(shí)現(xiàn)。在FPGA中實(shí)現(xiàn)流水燈的方法有很多種,我只列取了三種供參考學(xué)習(xí)。首先是運(yùn)用FPGA的并行處理特點(diǎn),建立四個(gè)always模塊分別對(duì)每隔led分別控制,也可以建立四個(gè)模塊分別對(duì)各個(gè)燈控制。所對(duì)應(yīng)的時(shí)序圖如圖1-a,每一個(gè)模塊控制相應(yīng)的led燈,彼此之間互不影響,依靠總的時(shí)鐘進(jìn)行工作。
圖1-a
這種方法能夠充分體現(xiàn)FPGA并行處理的特點(diǎn),實(shí)現(xiàn)起來(lái)也很容易。
頂層代碼為
moduletop_module(CLK, RSTn, LED_Out);
input CLK;
input RSTn;
output [3:0]LED_Out;
wire LED1_Out;
led1_module U1
(
.CLK(CLK),
.RSTn(RSTn),
.LED_Out(LED1_Out)
);
wire LED2_Out;
led2_module U2
(
.CLK(CLK),
.RSTn(RSTn),
.LED_Out(LED2_Out)
);
wire LED3_Out;
led3_module U3
(
.CLK(CLK),
.RSTn(RSTn),
.LED_Out(LED3_Out)
);
wire LED4_Out;
led4_module U4
(
.CLK(CLK),
.RSTn(RSTn),
.LED_Out(LED4_Out)
);
assign LED_Out = {LED4_Out, LED3_Out,LED2_Out, LED1_Out};
第二種方法為循環(huán)移位法。通過(guò)給led賦初值,然后循環(huán)左移或者循環(huán)右移,但是需要設(shè)置一個(gè)條件。否則就會(huì)出現(xiàn)溢出的情況。如圖2-a設(shè)置一個(gè)條件當(dāng)要出現(xiàn)溢出的時(shí)候讓它回到初始的狀態(tài),這樣就可以實(shí)現(xiàn)流水了。
圖2-a
代碼實(shí)現(xiàn)為
always @(posedge clk or negedge rst)
if(!rst)
led<=4'b0001; //初值,最低位led[0]燈亮
else if(counter==T100ms)
begin
if(led==4'b0000) //當(dāng)溢出最高位時(shí)
led<=4'b0001; //回到復(fù)位時(shí)的狀態(tài)
else
led<=led<<1; //循環(huán)左移一位
end
第三種數(shù)據(jù)拼接法,所謂的數(shù)據(jù)拼接就把原來(lái)的數(shù)據(jù)拆成一位一位的,在特定位置上拼接上一個(gè)數(shù)。例如在4位的led的低位拼接一個(gè)1. Led[3:0]<={led[2:0],1’b1};接即實(shí)現(xiàn)了數(shù)據(jù)的拼接,當(dāng)然可以實(shí)現(xiàn)任意位,任意bit數(shù)的拼。和循環(huán)移位類似,數(shù)據(jù)拼接的實(shí)現(xiàn)只是把移位命令改成拼接的命令即可。
總結(jié)
以上是生活随笔為你收集整理的永远的流水灯(Verilog)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 石头分子筛洗烘一体机H1 Neo体验:换
- 下一篇: 怎么创建具有真实纹理的CG场景岩石?