资源描述
多功能流水灯的设计
一.设计要求:
1. 设计一8盏彩灯控制电路,使彩灯可以向左,向右流动、全亮、全灭四种功能。功能变换可以手控也可以自控。
2. 自动功能变换时间10秒。
二.总体方案构思:
用Verilog语言来为单片机编程,通过编程来控制单片机各引脚在不同时间输出的不同的电平,进而控制个发光二级管的亮灭,以及控制流水灯的流速和流动方向。
1.使用按钮(auto)来控制手动或自动。
2.因为需要向左,向右,全亮,全灭四种功能,所以需要两个开关(btn1和btn2),分别用 开和关两种状态表示,即(00,01,10,11)。
3.使用clk时钟来记时和触发事件。
三.实验器材:
电脑和LED设备
四. 程序如下:
module LED(clk,auto,btn1,btn2,led);
input clk;
input auto;
input btn1;
input btn2;
output reg [7:0] led;
reg [29:0] count;//1ns的计数器
reg [3:0] count_10;//10秒的计数器
reg [1:0] status;//记录当前LED灯流动的情况:"00左到右,01右到左,10全亮,11全灭"
reg [1:0] type;
reg second_1;//1秒的标志
reg second_10;//10秒的标志
initial
begin
status<=2'b00;
type<=2'b00;
count<=30'b0;
count_10<=4'b0;
second_1<=1'b0;
second_10<=1'b0;
end
always@(posedge clk)//给出1s的标志和10s的标志
begin
if(count<25000000)//等待1s的到来
begin
count<=count+1;
second_1<=0;
second_10<=0;
end
else
begin
count<=0;
second_1<=1;
count_10<=count_10+1;
if(count_10>=4'd10)
begin
second_10<=1;
end
end
end
always@(posedge clk)//当自动的情况时,每10s变化一次流动状态
begin
if(auto==1 && second_1==1)
begin
if(second_10==1)
begin
if(status==2'b11)
begin
status<=2'b00;
end
else
begin
status<=status+1;
end
end
end
end
always@(posedge clk)//设置总变化状态等于手动或自动的状态
begin
if(second_1==1)
begin
if(auto==1)//自动
begin
type<=status;
end
else//手动
begin
type<={btn1,btn2};
end
end
end
always@(posedge clk)//根据type设置LED灯情况
begin
if(second_1==1)
begin
if(type==00)//左到右
begin
if(led==8'b00000000 || led==8'b11111111)
begin
led<=8'b10000000;
end
else
begin
led<=led>>1;
end
end
else if(type==01)//右到左
begin
if(led==8'b00000000 || led==8'b11111111)
begin
led<=8'b00000001;
end
else
begin
led<=led<<1;
end
end
else if(type==10)//全亮
begin
led<=8'b11111111;
end
else//全灭
begin
led<=8'b00000000;
end
end
end
endmodule
五. 测试图如下:
六.个人体会:
在这次实验中收货颇丰,我学会了使用简单的Verilog语言,更加深入的学习了数字逻辑,还有更多的,我学会和同学们合作,讨论,去解决问题。 在本次试验中,真的是像一次惊险的旅行,困难重重,各种低级失误,语法错误和硬件知识的缺乏,但最后还是在老师的耐心指导下完成了。
展开阅读全文