1 介紹
1.1 實(shí)現(xiàn)說(shuō)明
使用FPGA循環(huán)點(diǎn)亮led燈,有2種方式,有計(jì)數(shù),計(jì)時(shí)等。
1.2 硬件接口
按照上一節(jié),我們需要添加晶振電路,作為整個(gè)系統(tǒng)的時(shí)鐘來(lái)源。

時(shí)鐘電路
2 軟件實(shí)現(xiàn)
2.1 計(jì)時(shí)循環(huán)點(diǎn)亮1個(gè)LED燈
不做過(guò)多介紹,只需要了解基本的verilog語(yǔ)法即可。我貼出源代碼led_module.v:
module led_module(
clock,led0
);
input clock;
output led0;
reg rValue = 0;
wire led0 = rValue;
reg [32:0] cnt = 32'd0;
always @(posedge clock)
begin
if(cnt<32'd20000000) begin
cnt <= cnt + 1'd1;
end
else
begin
cnt <= 1'd0;
rValue <= rValue + 1'd1;
if(rValue == 2) begin
rValue <= 0;
end
end
end
endmodule
引腳分配如下圖所示:

引腳分配
其他如時(shí)鐘燈和前面的章節(jié)描述相同。
該試驗(yàn)?zāi)茯?yàn)證的內(nèi)容是led燈會(huì)亮一秒,滅一秒,一直循環(huán)下去。
2.2 計(jì)時(shí)循環(huán)點(diǎn)亮4個(gè)LED燈
這節(jié)使用頂層與底層設(shè)計(jì)思路,建立一個(gè)程序。
首先是引腳分配:

引腳分配
頂層程序led_module.v:
module led_module(
clock,led
);
input clock;
output [3:0] led;
wire led0;
led0_module_bottom u0(
.clock(clock),
.led(led0)
);
wire led1;
led1_module_bottom u1(
.clock(clock),
.led(led1)
);
wire led2;
led2_module_bottom u2(
.clock(clock),
.led(led2)
);
wire led3;
led3_module_bottom u3(
.clock(clock),
.led(led3)
);
assign led = {led3,led2,led1,led0};
endmodule
其余是底層程序:
led0_bottom.v:
module led0_module_bottom(
clock,led
);
input clock;
output led;
reg rValue = 0;
wire led = rValue;
reg [32:0] cnt = 32'd0;
always @(posedge clock)
begin
if(cnt<32'd2000000) begin
cnt <= cnt + 1'd1;
end
else
begin
cnt <= 1'd0;
rValue <= rValue + 1'd1;
if(rValue == 2) begin
rValue <= 0;
end
end
end
endmodule
led1_bottom.v:
module led1_module_bottom(
clock,led
);
input clock;
output led;
reg rValue = 0;
wire led = rValue;
reg [32:0] cnt = 32'd0;
always @(posedge clock)
begin
if(cnt<32'd20000000) begin
cnt <= cnt + 1'd1;
end
else
begin
cnt <= 1'd0;
rValue <= rValue + 1'd1;
if(rValue == 2) begin
rValue <= 0;
end
end
end
endmodule
led2_bottom.v:
module led2_module_bottom(
clock,led
);
input clock;
output led;
reg rValue = 0;
wire led = rValue;
reg [32:0] cnt = 32'd0;
always @(posedge clock)
begin
if(cnt<32'd1000000) begin
cnt <= cnt + 1'd1;
end
else
begin
cnt <= 1'd0;
rValue <= rValue + 1'd1;
if(rValue == 2) begin
rValue <= 0;
end
end
end
endmodule
led3_bottom.v:
module led3_module_bottom(
clock,led
);
input clock;
output led;
reg rValue = 0;
wire led = rValue;
reg [32:0] cnt = 32'd0;
always @(posedge clock)
begin
if(cnt<32'd5000000) begin
cnt <= cnt + 1'd1;
end
else
begin
cnt <= 1'd0;
rValue <= rValue + 1'd1;
if(rValue == 2) begin
rValue <= 0;
end
end
end
endmodule
這個(gè)程序?qū)崿F(xiàn)的是每一個(gè)led燈的閃爍都是按照各自設(shè)計(jì)的時(shí)間來(lái)的,從中,我們可以體會(huì)出fpga的并行設(shè)計(jì)的思想。