本帖最后由 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复用没有配置好。如下配置后正常编译。
五、上板验证
烧写代码验证具有流水灯效果的呼吸灯如下:
播放器加载失败: 未检测到Flash Player,请到
安装
b8ef9ebd5797c368f1c0a3e7318e15aa
工程代码: