`
本帖最后由 cxzs1234 于 2021-7-11 22:45 编辑
今天是周末,调试了半天程序,终于可以显示了,现在做一下总结。
在编程序前要解决一个问题是下载问题,之前遇到不能下载的情况,一直困扰了几天。后来发现可以直接使用
开发板的JTAG接口下载就可以,也就是相当于和板上的
FPGA并联。之前看文档说是可以联试连接,没想到可以并联。要识别MINI STAR上的
仿真器,需要在下载界面中Edit->Cable点击Query,就可以识别出开发板的JTAG,下载速度可选,比之前SPIEED的开发工具好用和快很多。
首先需要显示什么汉字,既然是高云组织的活动,就显示一个“高云FPGA”,高云汉字简单,12的高度可以正常显示出来,这样通过字模软件获取数据,并通过其它软件将数据整理。
最后按照高云在《Gowin 存储器(B-SRAM & S-SRAM)用户指南》最后一章怎么初始化数据文件的,制作好 font.mi文件,保存到工程目录中。
其次在设计中需要用到存储器,就是使用IP Core Generator 生成一个pROM,这个操作简单,使用也很方便。填写数据,点确定就行了。地址深度(Address Depth)也就是有多少字节存储,12*4=48,数据宽度(Data Width)选择16,需要说明的是这个数据宽度只能位1,2,4,8,16,32。因为配置其他的都会自动的大一号,比如填写12,最后自动改为16。最后找到刚才写的font.mi文件,系统就自动生成一个文件,把初始化的数据都填进去了。
最后写一个测试程序测试一下读取到的数据是否按自己的要求显示出来.
测试ROM的Top.v
- module demo (
- output [11:0] led
- );
- wire sys_clk;
- reg [11:0] led =12'h001;
- reg [5:0] adress = 6'b000000;
- wire [15:0] displayData;
- wire reset_n;
- reg ce;
- wire oce ;
- assign reset = 1'b0;
- assign oce = 1'b1;
- Gowin_OSC sysClk(.oscout(sys_clk)); //output oscout
- Gowin_pROM font_rom(
- .dout(displayData), //output [15:0] dout
- .clk(sys_clk), //input clk
- .oce(oce), //input oce
- .ce(ce), //input ce
- .reset(reset), //input reset
- .ad(adress));//input [5:0] adress
-
- reg[23:0] counter =24'h0;
-
- always @(posedge sys_clk )
- begin
- if (counter < 24'd1200_0000) // 0.5s delay
- counter <= counter + 1;
- else
- counter <= 24'd0;
- end
-
- always @(posedge sys_clk )
- begin
- if (counter == 24'd1199_9997) // 0.5s delay
- led[11:0] <= displayData[11:0];
- else
- led <= led;
- end
- //使能存储器
- always @(posedge sys_clk )
- begin
- if(counter == 24'd1199_9995)
- ce <= 1'b1;
- else if(counter == 24'd1199_9999)
- ce <= 1'b0;
- else
- ce <= ce;
- end
- //生成地址
- always @(posedge sys_clk )
- begin
- if(counter == 24'd1199_9999)
- if(adress == 6'd48)
- adress <= 0;
- else
- adress <= adress +1;
- else
- adress <= adress;
- end
- endmodule
在代码中没有用到reset,需要把它直接接0,这个是高电平复位。
这样就看到数据以0.5S的速度一个一个的显示出来。
数据在可以正常显示了,只要加快速度,且配合位置开关和一些时序程序就行了。
为了显得更专业些,这次进行分层编写程序,将显示部分单独出来,形成Display.v,并在Top.v中实例化。同时增加了如果长时间不转动就关闭功能,省电为主,因为纽扣电池电量有限啊。同时生成了一个2分频的时钟信号,传递给Display,也是像实验一下,没有多大的含义。
Top.v
- module demo (
- input pos,
- output pow_en,
- output [11:0] led_out
- );
- wire sys_clk;
- Gowin_OSC osc_clk(.oscout(sys_clk)); //output oscout
- wire led_clk_div2;
- Gowin_CLKDIV led_clk(
- .clkout(led_clk_div2), //output clkout
- .hclkin(sys_clk), //input hclkin
- .resetn(1'b1) //input resetn
- );
在Display.v中,使用了三段式状态机,比较常用的状态机,同时在该文件中实例化之前的ROM。通过状态机完成对ROM的读和LED显示时序按逻辑进行,还可以再优化一下,是程序更简练。
Display.v
通过综合和配置引脚,最后下载程序,这些步骤省略了,需要注意的是在Place & Route前要对一些多功能引脚进行配置(在Synthesize或者Place & Route上右键最后一项Configuration ),配置为普通IO,如下图所示,否则会出现错误。
就开始测试结果,基本上达到了实验要求。如视频所示,但是硬件上有点问题,现在总结如下:
1,板子做的有点长,手指短点就很容易碰到。
2,所用瓶盖(放有磁铁)有点软,不是很稳当,要么很容易曾到底部元器件,速度提不上来。或者距离有点远,导致霍尔传感器无法接触到信号,所以出现闪烁现象。其实实际效果比拍摄的要好一点,可以看清文字的。
3、硬件配置
威廉希尔官方网站
的两个电阻本应该接VCC的,结果没注意接到了地,也就有了那根红线的诞生,在上传的文件中已经修改了这个问题。
下一步准备将最后的四个APA102亮起来,在此更改打样一下
PCB,在重新制作一次。现将本次资料提供如下,欢迎指正。
`