一、设计要求
设计一个能够有多种工作模式控制的8个灯亮灭的电路。
工作模式1:按照从左到右的方向,依次点亮每一盏灯,然后依次熄灭每一盏灯;
工作模式2:分成两组灯,前四个灯为1组,后四个为2组,1组灯按从左到右依次点亮,同时2组灯按从右到左依次点亮,然后两组灯按各自点亮的顺序依次熄灭;
工作模式3:用11110000作为一组灯的序列,按照该顺序完成8盏灯亮灭:即首先灯1亮,然后灯2亮,然后灯3亮,然后灯4亮,然后灯5不亮,然后灯6不亮,然后灯7不亮,然后灯8不亮,然后八个灯同时变成亮,亮,亮,亮,不亮,不亮,不亮,不亮,并保持下去。
工作模式4:自行设计一个模式控制8个灯亮灭。要求和前三个工作模式不同。
要求每种工作模式重复两次,并在2分钟内完成所有工作模式。
输入信号: 选择信号[1:0]S, 时钟信号clk, 复位信号reset
输出信号: 跑马灯亮灭信号[7:0]Y
二、设计思路
用选择信号S控制四种模式的运行,用复位信号reset保证每个新模式的运行从第一个状态开始
1. 总体框图
2. 按功能模块的分模块结构图
运行模式1:
运行模式2:
运行模式3:
运行模式4:
3. 状态图
运行模式1:
运行模式2
运行模式3:
运行模式4:
三、代码实现
1. Verilog代码
module horse_race_lamp(input[1:0]S,
input clk,
input reset,
output reg[7:0]Y);
reg[33:0] cnt;
reg clk_div;
reg[3:0]state;
parameter
S0=0,
S1=1,
S2=2,
S3=3,
S4=4,
S5=5,
S6=6,
S7=7,
S8=8,
S9=9,
S10=10,
S11=11,
S12=12,
S13=13,
S14=14,
S15=15;
//******************分频模块************************//
/*
always@(posedge clk)//时钟周期:0.2*10^(-7)s,分频后的时钟周期:0.5s
begin
if(cnt==34'd25_000_000)
begin
clk_div<=~clk_div;
cnt<=0;
end
else
cnt<=cnt+1;
end
*/
//*************************************************//
always@(posedge clk or posedge reset)
begin
if(reset)
begin
Y[7:0]<=8'b0000_0000;
state<=S0;
end
else
case({S[1],S[0]})
2'b00:
begin
case(state)
S0:
begin
Y[7:0]<=8'b1000_0000;
state<=S1;
end
S1:
begin
Y[7:0]<=8'b1100_0000;
state<=S2;
end
S2:
begin
Y[7:0]<=8'b1110_0000;
state<=S3;
end
S3:
begin
Y[7:0]<=8'b1111_0000;
state<=S4;
end
S4:
begin
Y[7:0]<=8'b1111_1000;
state<=S5;
end
S5:
begin
Y[7:0]<=8'b1111_1100;
state<=S6;
end
S6:
begin
Y[7:0]<=8'b1111_1110;
state<=S7;
end
S7:
begin
Y[7:0]<=8'b1111_1111;
state<=S8;
end
S8:
begin
Y[7:0]<=8'b0111_1111;
state<=S9;
end
S9:
begin
Y[7:0]<=8'b0011_1111;
state<=S10;
end
S10:
begin
Y[7:0]<=8'b0001_1111;
state<=S11;
end
S11:
begin
Y[7:0]<=8'b0000_1111;
state<=S12;
end
S12:
begin
Y[7:0]<=8'b0000_0111;
state<=S13;
end
S13:
begin
Y[7:0]<=8'b0000_0011;
state<=S14;
end
S14:
begin
Y[7:0]<=8'b0000_0001;
state<=S15;
end
S15:
begin
Y[7:0]<=8'b0000_0000;
state<=S0;
end
default
begin
Y[7:0]<=8'b0000_0000;
state<=S0;
end
endcase
end
2'b01:
begin
case(state)
S0:
begin
Y[7:0]<=8'b1000_0001;
state<=S1;
end
S1:
begin
Y[7:0]<=8'b1100_0011;
state<=S2;
end
S2:
begin
Y[7:0]<=8'b1110_0111;
state<=S3;
end
S3:
begin
Y[7:0]<=8'b1111_1111;
state<=S4;
end
S4:
begin
Y[7:0]<=8'b0111_1110;
state<=S5;
end
S5:
begin
Y[7:0]<=8'b0011_1100;
state<=S6;
end
S6:
begin
Y[7:0]<=8'b0001_1000;
state<=S7;
end
S7:
begin
Y[7:0]<=8'b0000_0000;
state<=S0;
end
default
begin
Y[7:0]<=8'b0000_0000;
state<=S0;
end
endcase
end
2'b10:
begin
case(state)//11110000
S0:
begin
Y[7:0]<=8'b1000_0000;
state<=S1;
end
S1:
begin
Y[7:0]<=8'b0100_0000;
state<=S2;
end
S2:
begin
Y[7:0]<=8'b0010_0000;
state<=S3;
end
S3:
begin
Y[7:0]<=8'b0001_0000;
state<=S4;
end
S4:
begin
Y[7:0]<=8'b0000_0000;
state<=S5;
end
S5:
begin
Y[7:0]<=8'b0000_0000;
state<=S6;
end
S6:
begin
Y[7:0]<=8'b0000_0000;
state<=S7;
end
S7:
begin
Y[7:0]<=8'b0000_0000;
state<=S8;
end
S8:
begin
Y[7:0]<=8'b1111_0000;
state<=S0;
end
default
begin
Y[7:0]<=8'b0000_0000;
state<=S0;
end
endcase
end
2'b11:
begin
case(state)
S0:
begin
Y[7:0]<=8'b0101_0101;
state<=S1;
end
S1:
begin
Y[7:0]<=8'b1100_1100;
state<=S2;
end
S2:
begin
Y[7:0]<=8'b1010_1010;
state<=S3;
end
S3:
begin
Y[7:0]<=8'b0011_0011;
state<=S0;
end
default
begin
Y[7:0]<=8'b0000_0000;
state<=S0;
end
endcase
end
default
Y[7:0]<=8'b0000_0000;
endcase
end
endmodule
2. Testbench关键代码
initial
begin
clk=1;
reset=1;
#5 reset=0;
{S[1],S[0]}=2'b00;
#400 reset=1;
#5 reset=0;
{S[1],S[0]}=2'b01;
#200 reset=1;
#5 reset=0;
{S[1],S[0]}=2'b10;
#200 reset=1;
#5 reset=0;
{S[1],S[0]}=2'b11;
#100 $stop;
$display("Running testbench");
end
always
begin
#5 clk=~clk;
end
3. 程序的流程步骤
先将clk和reset初始化为1,5ps后,reset置零,选择信号为00,运行模式1。
400ps后,reset先变成1,5ps后再变成0,选择信号为01,运行模式2。
200ps后,reset先变成1,5ps后再变成0,选择信号为10,运行模式3。
200ps后,reset先变成1,5ps后再变成0,选择信号为11,运行模式4。
100ps后结束程序运行
其中时钟周期为10ps
四、仿真结果
运行模式1:
经过复位后,S变为00。Y按照工作模式1每盏灯亮灭的顺序输出不同的值。
运行模式2:
经过复位后,S变为01。Y按照工作模式2每盏灯亮灭的顺序输出不同的值。
运行模式3:
经过复位后,S变为10,Y按照工作模式3每盏灯亮灭的顺序输出不同的值
运行模式4:
文章来源:https://www.toymoban.com/news/detail-480787.html
经过复位后,S变为11,Y按照工作模式4每盏灯亮灭的顺序输出不同的值。文章来源地址https://www.toymoban.com/news/detail-480787.html
到了这里,关于基于Verilog的跑马灯设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!