硬件设计:
LED的点亮:
对应管脚的连接 高电平
流水灯的状态变化需要时间间隔,所以需要计时器
代码:
//定义模块名
module flow_led1(
//定义输入和输出信号
input sys_clk50, //定义系统时钟50MHZ
input rst_n, //定义外部按键复位信号,低电平有效
output reg [3:0] led //定义4个led,寄存器类型
);
//定义计数器
reg [23:0] cnt; //定义一个24位寄存器
/*系统时钟50M,T=20ns,用计时器对系统时钟计数到0.2s,那么0.2s/20ns=10^7,至少需要24bit数据*/
always @(posedge sys_clk50 or negedge rst_n)
begin
if(!rst_n)
cnt <= 24'd0;
else
if(cnt == 24'd9999999) //从0开始计数,故减一;用d是因为b位数太多了
cnt <= 24'd0;
else
cnt <= cnt + 24'd1; //1和0用b、d都可
end
/*
此处也可以用
if(cnt < d10000000)
cnt <= cnt + 24'd1;
else
cnt <= 24'd0;
*/
//定义逻辑功能。通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态
always @(posedge sys_clk50 or negedge rst_n) begin
if (!rst_n)
led <= 4'b0001;
else if(cnt == 24'd9999999)
led[3:0] <= {led[2:0],led[3]}; //实现移位
//{}可以实现位拼接,led[3:0]为0001,led[2:0]为初始化的末三位001,led[3]为初始化的高位的0,下一次循环也是
else
led <= led;
end
endmodule
不要小瞧一个小小的流水灯,复习了寄存器的数电知识,搞清原理,一行一行自己打出来并且理解,才算是真正学会。