Verilog设计流水灯(一)

2019-04-14 15:43发布

今天刚忙完大挑的策划,又到了更新博客的时候了,为了方便各位发烧友对Verilog_FPGA应用的学习,今天我想写一篇关于流水灯设计的文章,虽然很简单,但是这也是FPGA设计基础的重中之重,模块化设计! 初始流水灯,很傻,很天真。 这是我学习Verilog数字系统设计时悟出的真理,看着流水灯很神秘,其实往深处学习,很简单,很简单。 话不多说,先上一个模块,FPGA Verilog设计的重中之重就是模块化设计了,理清输入输出端口,将其封装,可以省去很多麻烦。 通过设计,我们自然可以得到它的输入输出端口:
这里写图片描述 这里,我们需要给它一个输入时钟,还有一个复位键,以及计数用到的计时器,然后FPGA给我们返回一个四位的LED,这里我们默认选择有四个LED(六个,八个,同理),我们摸清了它的输入与输出端口,然后我们可以开始我们的Verilog数字系统设计了。
先附上Verilog代码:顶层模块 module water_led( input clk,rst_n; input[31:0] counters; //这里的计数部分,我们可以选择其为寄存器,或者输入端口 output [3:0] led; ); endmodule 流水灯逻辑部分: module run_led( input clk,rst_n; output [3:0] led; ); reg [31:0] counters; reg [3:0] state; always@(posedge clk or negedge rst_n) begin if(!rst_n) begin counter<=0; led<=4'b0000; state<=4'b0000; end else beign case(state): 4'd0001:begin //第一个灯亮 led<=4'b0001; if(counters<=24999_999) //产生延时 通过改变counters的值,可以改变灯亮灭的速度 counters<=counters+1; else begin state<=4'b0010; counters<=0; end end 4'd0010:begin //第二个灯亮 led<=4'b0010; if(counters<=24999_999) counters<=counters+1; else begin state<=4'b0100; counters<=0; end end 4'd0100:begin //第三个灯亮 led<=4'b0100; if(counters<=24999_999) counters<=counters+1; else begin state<=4'b1000; counters<=0; end end 4'd1000:begin //第四个灯亮 led<=4'b10000; if(counters<=24999_999) counters<=counters+1; else begin state<=4'b0001; counters<=0; end end defualt: state<=4'd0001; end end endmodule modelsim测试代码如下: module run_led_tb(); reg clk,rst_n; wire [3:0] led; initial begin clk=0; forever #10 clk=~clk; //产生一个50MHZ时钟 end initial begin rst_n=0; #20 rst_n=1; // 激励 end run_led u1( //例化逻辑设计模块 .clk(clk), .rst_n(rst_n), .led(led)); endmodule 通过改变我们要计数延时的counters,我们可以把流水灯设计成跑马灯,以及频率更慢的led指示灯。 其实,FPGA设计最难的部分还是在于输入输出端口的选择,逻辑设计很简单,FPGA处理数据很快。通过这篇文章的模块化设计思想,我们可以更清晰地设计出我们想要的数字电路。