FPGAer:流水灯实战

流水灯想实现的功能:四个led灯依次点亮,形成“流水”的效果。 

实现过程: 

1、逻辑设计,Verilog编写。

 FPGAer:流水灯实战

因此要写一个模块flow_led,并在这个模块中实现计数和移位这两个功能。

这个模块input有两个引脚,sys_clk、sys_rst_n;这个模块output有四个引脚,led0、led1、led2、led3。

计数功能:这里需要计数0.2秒。需要芯片时钟的个数counter:

F=50MHz,T=1/F=0.2*10-7s

counter=0.2/0.2*10-7=107=1001 1000 1001 0110 1000 0000‬

所以定义reg [23:0]counter,107的二进制格式是24位

always @(posedge sys_clk or negedge sys_rst_n) begin

    if (!sys_rst_n)

        counter <= 24'd0;

    else if (counter < 24'd1000_0000)

        counter <= counter + 1'b1;

    else

        counter <= 24'd0;

end

移位功能:计数0.2秒后就移位一次。

always @(posedge sys_clk or negedge sys_rst_n) begin

    if (!sys_rst_n)

        led <= 4'b0001;

    else if(counter == 24'd1000_0000)

        led[3:0] <= {led[2:0],led[3]};

    else

        led <= led;

end

根据原理图,led高电平点亮,所以复位时候可以知道,一直就要一盏灯在亮。

2、确定引脚。

FPGAer:流水灯实战

从原理图中可看出,sys_clk接芯片引脚E1;sys_rst_n接芯片引脚M1。Led0、led1、led2、led3依次接芯片引脚D11、C11、E10、F9。

3、编译成功,烧写到开发板,实现功能。

4、仿真。

利用Modelsim软件进行仿真:

①定义时间单位和时间精度

②module 功能_tb;

③定义端口:reg 输入;wire 输出;(这里定义是reg型还是wire型与输入、输出无关)

④初始化输入:initial begin

                ………..

                ………..

                end

⑤代码例化:

功能 u_功能(

…………………

);

⑥endmodule

我这里在开发板上为了肉眼看到灯的切换,所以时间为每隔0.2秒才发生变化。但是这个时间在仿真时太长了,因此调整为0.2*10-6秒,这样方便在仿真的时候能看出led灯的变化。

那么修改之后就是每十个时钟,led就会移位一次。

经上述说,在开发板和modelsim都实现具体的效果,流水灯实战结束。