- 2025-02-08
-
加入了学习《如何设计FPGA-AXI总线》,观看 如何科学设计FPGA 从0手敲AXI总线接口
- 2025-02-07
-
加入了学习《如何设计FPGA-AXI总线》,观看 如何科学的设计FPGA:实现AXI总线自由之AXI解读
-
加入了学习《如何设计FPGA-AXI总线》,观看 如何科学设计FPGA VIVADO中的时序约束和分析以及进阶技巧
-
加入了学习《如何设计FPGA-AXI总线》,观看 如何科学设计FPGA:时序约束基础,了解时序分析模型
- 2025-02-06
-
回复了主题帖:
deepseek到底行不行啊?
maychang 发表于 2025-2-6 18:36
所以想要靠DeepSeek来学习数学、物理、电工、电子……那算是休想。
我现在基本都是用来列列提纲,写写文档,物理学对AI来说应该还是比较难理解。
- 2025-02-05
-
回复了主题帖:
这个春节最火爆的AI大模型deepseek,你玩了吗?
本基本上部署了一个,玩了没多久服务器就崩了后面
- 2025-02-03
-
回复了主题帖:
【Tang Primer 25K 测评】4、使用PMOD-DTx2模块点亮数码管(带呼吸效果)
Jacktang 发表于 2025-2-3 10:11
视频效果看数码管显示的比较好
应该是这个数码管本身就挺好的
- 2025-02-01
-
发表了主题帖:
【Tang Primer 25K 测评】4、使用PMOD-DTx2模块点亮数码管(带呼吸效果)
本帖最后由 1nnocent 于 2025-2-1 13:45 编辑
七段数码管是由七个等长的LED排列成一排,通常用于显示数字、字母或字符的一种常见的电子显示装置。每个段可以独立点亮或熄灭,因此它可以用来表示不同的数字或符号。实际就是多个LED灯,点亮不同的灯可以组合成不同的数字或字符,既然是LED灯那理论上也能实现呼吸灯的效果,本次实验也会将呼吸灯效果添加到数码管显示中。
功能需求:
显示数字0-9。
需要显示两位数码管,并使用动态扫描的方式“同时”显示两位数码管。
在以上的功能上添加呼吸灯效果。
硬件实现细节
digitaltube_driver模块:该模块用于控制两个bit数码管的显示,将需要显示的内容编码成0-9字符;两个数码管是交替显示的方式实现动态扫描效果。
module digitaltube_driver#(
parameter SWITCH_CNT = 'd300_000
)(
input clk,
input rst,
output reg dt_sel,
output [6:0]digitalTube
);
localparam P_0 = 7'b0000001 ;
localparam P_1 = 7'b1111001 ;
localparam P_2 = 7'b0010010 ;
localparam P_3 = 7'b0110000 ;
localparam P_4 = 7'b1101000 ;
localparam P_5 = 7'b0100100 ;
localparam P_6 = 7'b0000100 ;
localparam P_7 = 7'b1110001 ;
localparam P_8 = 7'b0000000 ;
localparam P_9 = 7'b0100000 ;
localparam P_X = 7'b1111111 ; //Truth Table for Displaying 0-9 on the Seven-Segment Display and for Blank Display
localparam INC_CNT = 'hfff_fff;
reg [31:0] cnt;
reg [31:0] cnt_switch;
reg [3:0] bit_ones;
reg [3:0] bit_tens;
reg [6:0] digitalTube_ones;
reg [6:0] digitalTube_tens;
assign digitalTube = dt_sel ? digitalTube_tens : digitalTube_ones;
always@(posedge clk)begin
if(rst)
cnt_switch <= 'd0;
else if(cnt_switch >= SWITCH_CNT)
cnt_switch <= 'd0;
else
cnt_switch <= cnt_switch + 'd1;
end
always@(posedge clk)begin
if(rst)
dt_sel <= 1'b1;
else if(cnt_switch >= SWITCH_CNT)
dt_sel <= !dt_sel;
else
dt_sel <= dt_sel;
end
always@(posedge clk)begin
if(rst)
cnt <= 'd0;
else if(cnt >= INC_CNT)
cnt <= 'd0;
else
cnt <= cnt + 'd1;
end
always@(posedge clk)begin
if(rst)
bit_ones <= 'd0;
else if(cnt >= INC_CNT)
bit_ones <= (bit_ones >= 'd9) ? 'd0 : (bit_ones + 'd1);
else
bit_ones <= bit_ones;
end
always@(posedge clk)begin
if(rst)
bit_tens <= 'd0;
else if(cnt >= INC_CNT)
if(bit_tens >= 'd9)
bit_tens <= 'd0;
else
bit_tens <= (bit_ones >= 'd9) ? (bit_tens + 'd1) : bit_tens;
else
bit_tens <= bit_tens;
end
always@(posedge clk)begin
if(rst)
digitalTube_ones <= 'b111_1111;
else if(cnt_switch >= SWITCH_CNT)
case(bit_ones)
4'd0 : digitalTube_ones <= P_0 ;
4'd1 : digitalTube_ones <= P_1 ;
4'd2 : digitalTube_ones <= P_2 ;
4'd3 : digitalTube_ones <= P_3 ;
4'd4 : digitalTube_ones <= P_4 ;
4'd5 : digitalTube_ones <= P_5 ;
4'd6 : digitalTube_ones <= P_6 ;
4'd7 : digitalTube_ones <= P_7 ;
4'd8 : digitalTube_ones <= P_8 ;
4'd9 : digitalTube_ones <= P_9 ;
default : digitalTube_ones <= digitalTube_ones ;
endcase
end
always@(posedge clk)begin
if(rst)
digitalTube_tens <= 'b111_1111;
else if(cnt_switch >= SWITCH_CNT)
case(bit_tens)
4'd0 : digitalTube_tens <= P_0 ;
4'd1 : digitalTube_tens <= P_1 ;
4'd2 : digitalTube_tens <= P_2 ;
4'd3 : digitalTube_tens <= P_3 ;
4'd4 : digitalTube_tens <= P_4 ;
4'd5 : digitalTube_tens <= P_5 ;
4'd6 : digitalTube_tens <= P_6 ;
4'd7 : digitalTube_tens <= P_7 ;
4'd8 : digitalTube_tens <= P_8 ;
4'd9 : digitalTube_tens <= P_9 ;
default : digitalTube_tens <= digitalTube_tens ;
endcase
end
endmodule
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_DT_top模块:该模块为该实验的顶层模块,例化了上述两个模块,digitaltube_driver模块用于驱动数码管,pwm_gen用于产生呼吸灯效果。
module PMOD_DT_top(
input clk,
input rst,
output dt_sel,
output [6:0]digitalTube
);
wire [6:0] digitalTube_dri;
wire pwm_out;
assign digitalTube[0] = digitalTube_dri[0] ? 1'b1 : (!pwm_out);
assign digitalTube[1] = digitalTube_dri[1] ? 1'b1 : (!pwm_out);
assign digitalTube[2] = digitalTube_dri[2] ? 1'b1 : (!pwm_out);
assign digitalTube[3] = digitalTube_dri[3] ? 1'b1 : (!pwm_out);
assign digitalTube[4] = digitalTube_dri[4] ? 1'b1 : (!pwm_out);
assign digitalTube[5] = digitalTube_dri[5] ? 1'b1 : (!pwm_out);
assign digitalTube[6] = digitalTube_dri[6] ? 1'b1 : (!pwm_out);
digitaltube_driver#(
.SWITCH_CNT ('d300_000)
)digitaltube_driver(
.clk (clk ),
.rst (rst ),
.dt_sel (dt_sel ),
.digitalTube (digitalTube_dri)
);
pwm_gen#(
.CYCLE (50_000 ),
.STEP (50 )
)pwm_gen(
.clk (clk ),
.rst (rst ),
.ena (1'b1 ),
.pwm_out (pwm_out )
);
endmodule
PMOD_DT_pin:管脚约束文件,该实验使用了clk,rst,数码管引脚控制信号等。
IO_LOC "rst" H11;
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;
IO_LOC "dt_sel" K5;
IO_PORT "dt_sel" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "digitalTube[6]" L11;
IO_PORT "digitalTube[6]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "digitalTube[5]" K11;
IO_PORT "digitalTube[5]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "digitalTube[4]" L5;
IO_PORT "digitalTube[4]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "digitalTube[3]" E10;
IO_PORT "digitalTube[3]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "digitalTube[2]" E11;
IO_PORT "digitalTube[2]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "digitalTube[1]" A11;
IO_PORT "digitalTube[1]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
IO_LOC "digitalTube[0]" A10;
IO_PORT "digitalTube[0]" PULL_MODE=NONE DRIVE=8 BANK_VCCIO=3.3;
功能验证
以下为上板验证效果:
[localvideo]cf4d267a974df1b38418caf31e25c540[/localvideo]
工程源码:
-
回复了主题帖:
【Tang Primer 25K 测评】3、高云IDE使用及PMOD-LEDx8模块点灯实验
秦天qintian0303 发表于 2025-2-1 08:23
这个直接有例程吗?看着好像汇编的写法
有例程但是我没看自己写的,用的是Verilog
- 2025-01-30
-
发表了主题帖:
【Tang Primer 25K 测评】3、高云IDE使用及PMOD-LEDx8模块点灯实验
本帖最后由 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复用没有配置好。如下配置后正常编译。
五、上板验证
烧写代码验证具有流水灯效果的呼吸灯如下:
[localvideo]55f1fc7002fba6b05e43569412ae64ae[/localvideo]
工程代码:
- 2025-01-29
-
回复了主题帖:
【Tang Primer 25K 测评】1、硬件开箱
walker2048 发表于 2025-1-29 21:39
PMOD也是支持I2C和SPI的,只是和常规淘宝模块接口区别比较大
我的意思是没有配iic和spi相关的扩展板,如果要学习iic和spi那就没有硬件环境了
-
发表了主题帖:
【Tang Primer 25K 测评】2、环境搭建
本帖最后由 1nnocent 于 2025-1-28 23:25 编辑
IDE安装过程用户手册中有介绍。
首先需要到官网下载安装包,广东高云半导体科技股份有限公司 ,本机是Windows系统所以选择For Win的版本。
下载完IDE软件压缩包后解压并双击进行安装。
点击next,再点击同意进行下一步安装。
之后Gowin和Gowin programmer都需要选上,其中的 Gowin 为 IDE 本体, 另一个 programmer 相关的是烧录软件。
选择安装路径后进行安装。
下一步不要更改任何东西,按照默认的点击Finish。
之后是安装驱动,之后一直点下一步,接受即可完成安装,桌面上显示Gowin_V1.9.11 (64-bit)图标便安装完成。
在licence过程中遇到了一点问题,就是这个开发板测评申请的是年终回炉的测评,已经接近年底了,现在(腊月廿八)才开始安装IDE,高云的工作人员都放假了,看网络上申请licence基本2个工作日就能拿到licence。就在以为测评要卡在licence上时这时候发现了一个帖子【高云】高云软件Gowin的license验证 - 高云 - 芯路恒电子技术论坛 - Powered by Discuz! 。可以通过修改本机物理地址的方式使用之前已经申请的licence。
但是....在这个帖子中没有找到licence,难道又要卡在licence这里了?最后发现这是个开发板的网站,该网站主页相应开发板的资料中可以找到licence。
最后成功添加licence,一波三折,看来年终回炉的测评要提前注意测评开发板使用到的IDE是否需要licence,需要的话趁早在放假前申请好licence以免影响测评进度。
licence安装完成之后使用官方提供的历程下载试下效果。
[localvideo]b2a997ef4ce54064976419a4c7148404[/localvideo]
- 2025-01-28
-
回复了主题帖:
旧手机你们一般怎么处理?
dcexpert 发表于 2025-1-28 11:36
安装termux、tailscale等app,作为随身服务器,非常方便。
怎么玩啊?有没有教程
-
回复了主题帖:
【Tang Primer 25K 测评】1、硬件开箱
wangerxian 发表于 2025-1-28 09:12
模块化开发板就是不错,节约成本,还可以任意搭配
是的,这个扩展板很好用
- 2025-01-27
-
发表了主题帖:
【Tang Primer 25K 测评】1、硬件开箱
Tang Primer 25K开发板收到了,板子非常小巧,看到这个板子让我想起了之前的ufun板。
首先来看下开发板主体,左边是本次测评的Tang Primer 25K 开发板,右边是之前的ufun开发板,两者相同的特点是都很小巧,大概三指这么大。如果说ufun是stm中最小巧的开发板,那么Tang Primer 25K 是FPGA中最小巧的开发板。
Tang Primer 25K是基于 GW5A-LV25MG121 设计的一款极小封装的核心板(23x18mm),虽然整体比较小巧,但是芯片资源还是不错的。
项目
参数
补充
FPGA 芯片
GW5A-LV25MG121
逻辑单元(LUT4)
23040
寄存器(FF)
23040
分布式静态随机存储器S-SRAM(bits)
180K
块状静态随机存储器B-SRAM(bits)
1008K
块状静态随机存储器数目B-SRAM(个)
56
乘法器(18x18 Multiplier)
28
锁相环(PLLs)
6
I/O Bank 总数
8
Flash
64Mbits NOR Flash
整体封装
2x60P BTB 核心板
普通IO
75
MIPI IO
4lane Data
该开发板分为核心板,Dock底板和6个扩展PMOD板。其中核心板仅仅只有一元硬币大小;Dock底板将核心板的IO引出并留有PMOD扩展板接口;另外还配备了6块PMOD接口的扩展板(两个LED扩展板、一个HDMI接口扩展板、一个SD卡扩展板、一个按键扩展板、一个数码管扩展板)。
LED扩展板:每块LED扩展板上有八个LED灯,学习开发板点灯必备。而且还配了两块LED扩展板,量大管饱了属于是。
HDMI接口扩展板:Tang Primer 25K 开发板虽然只有三指大小,但是加上这个HDMI扩展板后也能实现点亮显示器的功能。
SD卡扩展板:SD卡拓展板的加入让Tang Primer 25K开发板变得更加灵活,需要使用到SD卡时插入SD卡扩展板即可,并且该扩展板同样非常小巧;不需要SD的场景时也能取下来,腾出了宝贵的IO资源以用于其他地方。
按键扩展板:按键扩展板不仅只含有4个轻触按键,另外还带有4个拨码开关。
数码管扩展板:数码管扩展板配备两个7段数据管,两个不多也不少,静态数码管和动态数码管都能覆盖到,市面上有些开发板配备了多个数码管,个人觉得两个以上都没啥意义了就是数量上的差异还占空间。
总结:Tang Primer 25K 这块开发板给我的感觉是有优点也有一点点不足的地方。
优点:1、开发板整体很小巧,日常学习使用携带很方便;
2、配备的PMOD接口的扩展板很实用,在其他开发板上也能使用,学习完还能将这些扩展板拿掉自己添加需要的扩展;
缺点:1、一些常见的接口协议没有相应的外设,比如iic、spi等等,后续打算自己做一个iic接口的PMOD扩展板,手头刚好有一个iic协议的温度传感器。
- 2025-01-23
-
回复了主题帖:
【 EEWORLD陪你过大年,新年积分兑换盲盒收到啦!】
光这个屏幕就值了啊
-
回复了主题帖:
收到盲盒礼物:FSSDC-9B506-EK Easy Kit
wenyangzeng 发表于 2025-1-23 15:48
十多年前的软件平台现在找不到,玩不起来
只能拆个屏幕玩了,不知道还能不能找到驱动程序
-
回复了主题帖:
收到盲盒礼物:FSSDC-9B506-EK Easy Kit
我也开到这个了
- 2025-01-20
-
回复了主题帖:
【复刻瀚文键盘】7、键盘组装(完工)
Alohaq 发表于 2025-1-20 11:01
好奇扩展板您现在用来干什么呀?总觉得这玩意实际用起来很鸡肋
墨水屏纯好看一点,那个电机可以实现鼠标滚轮的功能
- 2025-01-19
-
回复了主题帖:
【测评入围名单(最后1批)】年终回炉:FPGA、AI、高性能MCU、书籍等65个测品邀你来~
个人信息确认无误,可以完成计划。