设计要求
要求为上电实现4位led依次循环点亮,按下复位按键熄灭。
设计思路
主要采用case语句或者移位的形式实现依次点亮功能,前者类似于“递推赋值”,后者是比较容易理解且全面点的。
设计代码1(case语句实现)
module water_light2(
input clk,
input rst_n, //复位按键
output [3:0] led
);
reg[1:0] state=0; //判断led的位置
reg[4:0] led;
reg [21:0]cn=0; //分频系数
reg clk_show=0; //分频后的时钟信号
always @ ( posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
clk_show<=0;
cn<=0;
end
else
if(cn<12) //分频系数cn可自行调整
cn<=cn+1;
else
begin
cn<=0;
clk_show<=~clk_show;
end
end
always@(posedge clk_show or negedge rst_n )
begin
if(!rst_n)
begin
led<=4'b1111;
state<=0;
end
else
begin
case(state)
0:begin //开始时state为0,满足条件
led<=4'b0111;
state<=1;
end
1:begin
led<=4'b1011;
state<=2;
end
2:begin
led<=4'b1101;
state<=3;
end
3:begin
led<=4'b1110;
state<=0;
end
default:
state<=0;
endcase
end
end
endmodule
Modelsim仿真测试
可能由于重装过ise和modelsim,数据库不一样。仿真加载不出。所以代码仅供参考。
下一次写闪耀灯再做完整仿真。
设计代码2
这一种方法比较全面,亮的间隔以及消除毛刺都有涉及,当然资源使用就比较多,这里没有涉及到优化。(没有复位按键设计,可自行添加。)
module led(
input clk_50m,
output [7:0] led
);
parameter T0S2=100;//10000000 //100方便仿真
reg [10:0]counter=0;
// wire clk_2hz; //0.5s间隔
///中间变量主要为消除毛刺///
reg [7:0] led0 = 0;
reg [7:0] led1 = 0;
always@(posedge clk_50m) begin //计数模块
if (counter == T0S2) begin
counter <= 0;
end
else counter <= counter+1;
end
reg [2:0]adress=0;
reg flag=0;
always@(posedge clk_50m)begin //判断循环标志位
if(adress==7)
flag <= 1;
else if(adress==0)
flag <=0;
else flag <= flag;
end
always@(posedge clk_50m)begin //移位操作
if(counter==(T0S2/2))begin
if(flag==1)
adress <= adress-1;
else if(flag==0)
adress <= adress+1;
end
else adress <= adress;
end
always@(adress)begin 判断第几位点亮,其余位为灭
led0 <= 8'b0000_0000;
led0[adress] <= 1;
end
// D触发器消除毛刺
always@(posedge clk_50m)begin
led1 <= led0;
end
assign led = led1;
endmodule
RTL原理图
Modelsim仿真
激励文件中只需要产生个(50m)时钟信号即可。
仿真波形如上,功能实现。如果要设计间隔,只需调整代码中的计数参数即可。
能力有限,如有问题还请指出。
闪烁灯+7位流水灯的实现(仿真有点显示问题,开发板暂无)
方法与上面第二个相同,主要就是高一位负责1s的闪烁,低7位负责流水的实现。
仿真有点小问题,我猜测哈,是拼接符的使用问题(因为对8位差错改变,不知道该显示哪个?),仿真显示时间有点不对。如果将闪烁灯那一位单独提出来输出就没问题。
单独的看闪烁灯的间隔是1s没错,那流水灯就感觉不对,由于没有开发板也没法验证。感兴趣的大佬还请告知哪儿错了 -。
最后一个实验完整程序
链接: https://pan.baidu.com/s/1zZg65_VeRBRTpD04XP74RQ 提取码: snxt