目錄
設計目標:8個LED燈以每0.5s的速率進行循環(huán)閃爍
方法1:移位法實現(xiàn)
設計模塊
仿真代碼
實驗結(jié)果
?方法2:循環(huán)移位方法
?設計模塊
方法3:使用三八譯碼器實現(xiàn)流水燈
頂層模塊
底層模塊
設計目標:8個LED燈以每0.5s的速率進行循環(huán)閃爍
當仿真時時間長,可以減小設計代碼的計數(shù)次數(shù),對分析移位功能沒有影響。
方法1:移位法實現(xiàn)
設計模塊
module led_run(
Clk,
Reset_n,
led
);
input Clk;
input Reset_n;
output reg [7:0]led;
reg [24:0] counter;
always@(podedge Clk or negedge Reset_n)
if(!Reset_n)
counter <= 0;
else if(counter == 24999999)
counter <= 0;
else
counter <= counter + 1'd1;
always@(podedge Clk or negedge Reset_n)
if(!Reset_n)
led <= 8'b0000_0001;
else if(counter == 24999999)begin
if(led == 8'b1000_0000)
led <= 8'b0000_0001;
else
led <= led << 1;
end
else
led = led;
endmoduule
仿真代碼
`timescale 1ns/1ns
module led_run_tb();
reg Clk;
reg Reset_n;
wire [7:0]led;
led_run led_run(
.Clk(Clk),
.Reset_n(Reset_n),
.led(led)
);
initial Clk = 1;
always #10 Clk = ~Clk;
initial begin
Reset_n = 0;
#201;
Reset_n = 1;
#4000000000; //延時4s
$stop;
end
endmodule
實驗結(jié)果
?方法2:循環(huán)移位方法
知識點:位拼接
?設計模塊
module led_run1(
Clk,
Reset_n,
led
);
input Clk;
input Reset_n;
output reg [7:0] led;
reg [24:0] counter;
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
counter <= 0;
// else if(counter == 24999999)
else if(counter == 24999) //500us
counter <= 0;
else
counter <= counter + 1'd1;
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
led = 8'b0000_0001;
// else if(counter == 24999999)begin
else if(counter == 24999)
led <= {led[6:0],led[7]}; //位拼接
else
led <= led;
endmodule
方法3:使用三八譯碼器實現(xiàn)流水燈
知識點:1.計數(shù)器記滿清零。2. 模塊間的調(diào)用。
在當前模塊中調(diào)用三八譯碼器模塊,將38譯碼器的設計模塊添加到當前文件夾中,在led_run2.v中通過接口調(diào)用三八譯碼器。
將led_run2.v中的 led 接到三八譯碼器的 out 端口上時,led 不能再定義為 reg 型,因為三八譯碼器底層已經(jīng)將out定義為reg型。底層已經(jīng)定義了reg型,頂層就不能再定義reg型。 led是由底層模塊驅(qū)動的,頂層只能定義為wire型。文章來源:http://www.zghlxwxcb.cn/news/detail-741425.html
頂層模塊
module led_run2(
Clk,
Reset_n,
led
);
input Clk;
input Reset_n;
output [7:0] led;
reg [24:0] counter;
reg [2:0] counter1; //二進制8個狀態(tài),3位
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
counter <= 0;
// else if(counter == 24999999)
else if(counter == 24999) //500us
counter <= 0;
else
counter <= counter + 1'd1;
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
counter1 <= 0;
// else if(counter == 24999999)
else if(counter == 24999)
counter1 <= counter1 + 1'b1;
decoder_3_8 decoder_3_8(
.a(counter1[2]), //counter1[2] 是最高位
.b(counter1[1]),
.c(counter1[0]),
.out(led) //底層已將out定義為reg型,所以頂層不能再定義成reg型
);
endmodule
底層模塊
module decoder_3_8(
a,
b,
c,
out
);
input a;
input b;
input c;
output reg [7:0] out;
// 2種寫法:reg [7:0] out;
//以always塊描述的信號賦值,被賦值對象必須定義為reg類型
//{a,b,c}拼接成了一個三位信號
always@(*)begin
case({a,b,c})
3'b000: out = 8'b0000_0001;
3'b001: out = 8'b0000_0010;
3'b010: out = 8'b0000_0100;
3'b011: out = 8'b0000_1000;
3'b100: out = 8'b0001_0000;
3'b101: out = 8'b0010_0000;
3'b110: out = 8'b0100_0000;
3'b111: out = 8'b1000_0000;
endcase
end
endmodule
defparam寫法不能在testbench中生效文章來源地址http://www.zghlxwxcb.cn/news/detail-741425.html
到了這里,關于5.2 FPGA:基于verilog的LED流水燈設計(多種方法)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!