计算机组成-Verilog流水灯实验
综述
基本上计算机专业应该都玩过的实验。真的很有意思,不过当时划了水。不过当时是和一个伙伴一起做的,我们还额外添加了反转功能等。
原理
LED流水灯原理
让二极管形成流水灯,即先点亮一个LED灯,等待一小段时间后熄灭;再让第二个LED灯点亮,过一小段时间后再熄灭;以此类推,当最后一个LED灯点亮后,过一小段时间后熄灭,然后再点亮第一个LED灯,如此循环。
在本文中,我们在实现了流水灯的基础上,还拓展实现了可以实时反向,双向置位的双向流水灯。
实验任务
设计LED流水灯控制模块,模块有2输入clk和ret,8输出LED(1-8),其中clk为接入时钟,ret为复位,当ret为0时,无流水效果。8个LED灯依次顺序点亮,产生流水效果,相邻LED灯发光时间间隔大约为0.5s,人眼可以明显感知到这个间隔。我们这里的间隔可以通过脉冲直接控制。
关于Verilog
编程实现
首先使用建立Verilog程序编写文件,然后写入代码:
注意项目名必须和我们第一个module一致。我们的项目名为led所以声明module为led;
module led (
input wire Clock,
input wire RESET_N,
input wire RESET_N2,
input wire direction,
output reg [7:0] LED
);
reg [32:0] cnt;
always @(posedge Clock )
begin
if (RESET_N ==1)
begin
cnt <= 0 ;
LED <= 8'b00000001;
end
else if (RESET_N2==1)
begin
cnt <= 0 ;
LED <= 8'b10000000;
end
else if (cnt == 25000000)
begin
if(direction==1)
begin
if(LED==8'b00000001) LED <= 8'b10000000;
else LED <= LED>>1'b1;
end
else
begin
if(LED==8'b10000000) LED <= 8'b00000001;
else LED <= LED<<1'b1;
end
cnt <=0 ;
end
else
cnt <= cnt+1;
end
endmodule