一、计时器设计
`timescale 1ns / 1ps
//1s计数器
module count(
input sys_clk , //系统时钟
input rst_n , //系统复位
output reg[25:0] cnt //根据时钟周期20ns算出1s计数50000000次
);
parameter TIME_1s=26'd50_000_000; //定义计数器最大值
always@(posedge sys_clk)
if(rst_n==0) //赋初值
cnt<=0;
else begin rst_n==1
if(cnt==TIME_1s-1)
cnt<=0;
else
cnt<=cnt+1;
end
endmodule
二、流水灯设计
`timescale 1ns / 1ps
/*
移位运算符实现流水灯
*/
module led_out(
input sys_clk ,
input rst_n ,
input wire[25:0] cnt , //cnt作为led模块输入的时候记得一定要给位宽,不然默认位宽是2的话计数器跑不起来
output reg[3:0] led
);
parameter TIME_1s= 26'd50_000_000;
always@(posedge sys_clk)
if(rst_n==0)
led<=4'b0010; //这块因为要使用移位运算符的方式,因此初值不可以是0000,不然怎么移位都是0,左移的话初值不能是1000
else if(cnt==TIME_1s-1)begin //右移的话初值不能是0001
if(led==4'b1000) //使用移位运算符时注意到cnt到最大值时,此时产生两种情况:1、led=1000时,跳变到0001
led<=4'b0001; // 2、led正常左移
else
led<=led<<1;
end
else ///1s没有计到
led<=led;
endmodule
三、采用block将流水灯和计数器链接在一起
先创建一个block
直接拖进来
最后绑定管脚,生成比特流,烧录进板子就可以了(后续这些步骤的详细操作可以看我的另一篇博客Xilinx FPGA:vivado用状态机写4位流水灯,含按键消抖 zynq7000-CSDN博客)