本帖最后由 1nnocent 于 2025-1-29 21:51 编辑
高云官网可以下载通用指南,里面包含了各种资料,包括fpga使用的原语、IDE使用指南、约束指南等等。
一、设计思路
- 实现 LED 数组的动态闪烁效果。
- 模拟人呼吸的节奏,通过控制 LEDs 的亮度变化来达到“呼出”和“吸气”的效果。
- 支持多通道 LED 显示。
二、工程建立
打开Gowin软件,点击New Project...建立工程,并设置好工程名称和保存路径,这里可以勾选默认路径,下次打开可以不用再选择路径。
选择器件时选中GW5A-LV25MG121NES型号。
最后点击finish就能完成工程的建立。
三、代码编写
新建文件选择Verilog File。
pwm_gen模块:该模块用于产生pwm信号来驱动led实现呼吸灯效果,模块时钟默认50MHz,pwm一个周期为2秒,占空比变化2千次。以下为pwm_gen的代码。
module pwm_gen#(
parameter CYCLE = 50_000,
parameter STEP = 50
)(
input clk,
input rst,
input ena,
output pwm_out
);
reg [31:0] cycle_cnt;
reg [31:0] pwm_cnt;
reg pwm_flag;
wire pwm_inc;
always@(posedge clk)begin
if(rst)
cycle_cnt <= 'd0;
else if(ena)
cycle_cnt <= cycle_cnt >= CYCLE ? 'd0 : (cycle_cnt + 'd1);
else
cycle_cnt <= 'd0;
end
always@(posedge clk)begin
if(rst)
pwm_cnt <= 'd0;
else if(cycle_cnt >= CYCLE)
pwm_cnt <= pwm_cnt >= CYCLE ? 'd0 : (pwm_cnt + STEP);
else
pwm_cnt <= pwm_cnt;
end
always@(posedge clk)begin
if(rst)
pwm_flag <= 1'b1;
else
pwm_flag <= pwm_cnt >= CYCLE ? !pwm_flag : pwm_flag;
end
assign pwm_inc = cycle_cnt <= pwm_cnt;
assign pwm_out = pwm_flag ? pwm_inc : !pwm_inc;
endmodule
PMOD_LED_top模块:该模块为顶层模块,顶层模块例化了8个pwm_gen模块分别用于驱动8个led灯,每个灯的“呼吸”频率相同并且起点相互错开(第一个结束时第八个刚好开始),这样就可以实现具有流水灯效果的呼吸灯。以下为顶层模块的代码:
module PMOD_LED_top(
input clk,
input rst,
output [7:0]led
);
parameter LED_STEP = 6_250_000;
reg [7:0] ena;
reg [31:0] cnt;
always@(posedge clk)begin
if(rst)
cnt <= 'd0;
else if(cnt >= LED_STEP)
cnt <= 'd0;
else
cnt <= cnt + 'd1;
end
always@(posedge clk)begin
if(rst)
ena <= 'd1;
else if(cnt >= LED_STEP)begin
ena <= {ena[6:0],ena[0]};
end
else
ena <= ena;
end
genvar i;
generate
for(i=0;i<=7;i=i+1)
pwm_gen#(
.CYCLE (50_000 ),
.STEP (50 )
)pwm_gen(
.clk (clk ),
.rst (rst ),
.ena (ena[i] ),
.pwm_out (led[i] )
);
endgenerate
endmodule
管脚约束
IO_LOC "rst_n" H11;
IO_PORT "rst_n" PULL_MODE=DOWN DRIVE=OFF BANK_VCCIO=3.3;
IO_LOC "clk" E2;
IO_PORT "clk" PULL_MODE=NONE DRIVE=OFF BANK_VCCIO=3.3;
IO_LOC "led[7]" A11;
IO_LOC "led[6]" A10;
IO_LOC "led[5]" E11;
IO_LOC "led[4]" E10;
IO_LOC "led[3]" K11;
IO_LOC "led[2]" L11;
IO_LOC "led[1]" L5;
IO_LOC "led[0]" K5;
IO_PORT "led[7]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_PORT "led[6]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_PORT "led[5]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_PORT "led[4]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_PORT "led[3]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_PORT "led[2]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_PORT "led[1]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_PORT "led[0]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "rst" H10;
IO_PORT "rst" PULL_MODE=DOWN DRIVE=OFF BANK_VCCIO=3.3;
IO_LOC "clk" E2;
IO_PORT "clk" PULL_MODE=NONE DRIVE=OFF BANK_VCCIO=3.3;
四、编译
编译过程中发现有报错,检查了clk信号的约束语句没有问题,但就是报错了
最后在网上搜索了一番发现是IO复用没有配置好。如下配置后正常编译。
五、上板验证
烧写代码验证具有流水灯效果的呼吸灯如下:
b8ef9ebd5797c368f1c0a3e7318e15aa
工程代码: