1 介绍
1.1 实现说明
使用FPGA循环点亮led灯,有2种方式,有计数,计时等。
1.2 硬件接口
按照上一节,我们需要添加晶振电路,作为整个系统的时钟来源。
时钟电路
2 软件实现
2.1 计时循环点亮1个LED灯
不做过多介绍,只需要了解基本的verilog语法即可。我贴出源代码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
引脚分配如下图所示:
引脚分配
其他如时钟灯和前面的章节描述相同。
该试验能验证的内容是led灯会亮一秒,灭一秒,一直循环下去。
2.2 计时循环点亮4个LED灯
这节使用顶层与底层设计思路,建立一个程序。
首先是引脚分配:
引脚分配
顶层程序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
这个程序实现的是每一个led灯的闪烁都是按照各自设计的时间来的,从中,我们可以体会出fpga的并行设计的思想。