一、設(shè)計(jì)要求
設(shè)計(jì)一個(gè)能夠有多種工作模式控制的8個(gè)燈亮滅的電路。
工作模式1:按照從左到右的方向,依次點(diǎn)亮每一盞燈,然后依次熄滅每一盞燈;
工作模式2:分成兩組燈,前四個(gè)燈為1組,后四個(gè)為2組,1組燈按從左到右依次點(diǎn)亮,同時(shí)2組燈按從右到左依次點(diǎn)亮,然后兩組燈按各自點(diǎn)亮的順序依次熄滅;
工作模式3:用11110000作為一組燈的序列,按照該順序完成8盞燈亮滅:即首先燈1亮,然后燈2亮,然后燈3亮,然后燈4亮,然后燈5不亮,然后燈6不亮,然后燈7不亮,然后燈8不亮,然后八個(gè)燈同時(shí)變成亮,亮,亮,亮,不亮,不亮,不亮,不亮,并保持下去。
工作模式4:自行設(shè)計(jì)一個(gè)模式控制8個(gè)燈亮滅。要求和前三個(gè)工作模式不同。
要求每種工作模式重復(fù)兩次,并在2分鐘內(nèi)完成所有工作模式。
輸入信號(hào): 選擇信號(hào)[1:0]S, 時(shí)鐘信號(hào)clk, 復(fù)位信號(hào)reset
輸出信號(hào): 跑馬燈亮滅信號(hào)[7:0]Y
二、設(shè)計(jì)思路
用選擇信號(hào)S控制四種模式的運(yùn)行,用復(fù)位信號(hào)reset保證每個(gè)新模式的運(yùn)行從第一個(gè)狀態(tài)開始
1. 總體框圖
2. 按功能模塊的分模塊結(jié)構(gòu)圖
運(yùn)行模式1:
運(yùn)行模式2:
運(yùn)行模式3:
運(yùn)行模式4:
3. 狀態(tài)圖
運(yùn)行模式1:
運(yùn)行模式2
運(yùn)行模式3:
運(yùn)行模式4:
三、代碼實(shí)現(xiàn)
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)//時(shí)鐘周期:0.2*10^(-7)s,分頻后的時(shí)鐘周期: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關(guān)鍵代碼
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置零,選擇信號(hào)為00,運(yùn)行模式1。
400ps后,reset先變成1,5ps后再變成0,選擇信號(hào)為01,運(yùn)行模式2。
200ps后,reset先變成1,5ps后再變成0,選擇信號(hào)為10,運(yùn)行模式3。
200ps后,reset先變成1,5ps后再變成0,選擇信號(hào)為11,運(yùn)行模式4。
100ps后結(jié)束程序運(yùn)行
其中時(shí)鐘周期為10ps
四、仿真結(jié)果
運(yùn)行模式1:
經(jīng)過復(fù)位后,S變?yōu)?0。Y按照工作模式1每盞燈亮滅的順序輸出不同的值。
運(yùn)行模式2:
經(jīng)過復(fù)位后,S變?yōu)?1。Y按照工作模式2每盞燈亮滅的順序輸出不同的值。
運(yùn)行模式3:
經(jīng)過復(fù)位后,S變?yōu)?0,Y按照工作模式3每盞燈亮滅的順序輸出不同的值
運(yùn)行模式4:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-480787.html
經(jīng)過復(fù)位后,S變?yōu)?1,Y按照工作模式4每盞燈亮滅的順序輸出不同的值。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-480787.html
到了這里,關(guān)于基于Verilog的跑馬燈設(shè)計(jì)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!