在过去的十天里,我参加了FPGA的实习,学习了一系列关于FPGA开发的内容。在这段时间里,我掌握了数码管、呼吸灯、按键消抖、LED流水灯等基本概念,并学会了编写测试文件和顶层文件。以下是我对这些内容的总结和归纳:
呼吸灯
呼吸灯是一种能够呈现渐变效果的灯光,类似于人类的呼吸。在FPGA开发中,我们可以使用PWM(脉宽调制)技术来实现呼吸灯的效果。PWM是一种通过调整高电平和低电平的占空比来控制信号的技术。通过改变灯光的亮度和周期,可以让灯光呈现渐变效果。在FPGA中,我们可以使用计数器和比较器(控制占空比)来生成PWM信号,并将其作为控制信号来控制LED的亮度。
module pwm_led(
input clk,
input rst_n,
output reg[3:0] led
);
parameter TIME_US = 6'd49;//微秒
parameter TIME_MS = 10'd999;//毫秒(每50*20微秒=一毫秒)
parameter TIME_S = 10'd999;//秒(每1000毫秒=一秒)
reg [5:0]cnt_us;
reg [9:0]cnt_ms;
reg [9:0]cnt_s;
reg flag;
wire add_cnt_us;//us计数器开始信号
wire end_cnt_us;//us计数器结束信号
wire add_cnt_ms;//ms计数器开始信号
wire end_cnt_ms;//ms计数器结束信号
wire add_cnt_s;//s计数器开始信号
wire end_cnt_s;//s计数器结束信号
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt_us <= 6'd0;
end
else if(add_cnt_us) begin
if (end_cnt_us) begin
cnt_us <= 6'd0;
end
else begin
cnt_us <= cnt_us + 1'd1;
end
end
else begin
cnt_us <= cnt_us;
end
end
assign add_cnt_us = 1'b1;//开始计数条件
assign end_cnt_us = (add_cnt_us) && (cnt_us == TIME_US);//结束计数条件(当cnt_us计满50次(50*20ns=1ms)时,归零并重新计数)
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt_ms <= 10'd0;
end