`
本帖最后由 cxzs1234 于 2021-6-30 09:48 编辑
由于制作的旋转显示(也可以称为LED手指陀螺 )空间有限,而且GW1N中刚好有片内晶振提供可编程的用户时钟。其中GW1N-1为250M,精度5%。根据数据手册知道通过配置工作参数,可以获得多达 64 种时钟频率。如下图所示:
我们可以通过Gowin的软件的IP Core Generate中选择OSC进行对内部时钟的配置,如下图:
我需要一个25M的时钟,因此参数配置为10,该参数只能为2-100之间的偶数。点击“确定”,当然也可以修改名字等,根据个人喜好选择。
在我们的项目中自己生成了一个gowin_osc.v文件:
- module Gowin_OSC (oscout);
- output oscout;
- OSCH osc_inst (
- .OSCOUT(oscout)
- );
- defparam osc_inst.FREQ_DIV = 10;
- endmodule //Gowin_OSC
其实还有一个实例化例程文件,如果不会实例化的可以参考一下。
在此我直接在我的Top.v进行实例化,并作为给LED 的时钟源,一个简单的流水灯实例,同时将该时钟输出进行测试。
Top.v
- module demo (
- input sys_rst_n, // reset input
- output clk_out,
- output reg [2:0] led // 110 G, 101 R, 011 B
- );
- wire sys_clk;
- wire clk_out;
- assign clk_out = sys_clk;//将内部时钟输出
- Gowin_OSC sysClk(.oscout(sys_clk)); //实例化内部晶振
- reg[23:0] counter;
-
- always @(posedge sys_clk or negedge sys_rst_n)//
- begin
- if(!sys_rst_n)
- counter <= 24'd0;
- else
- begin
- if (counter < 24'd1200_0000)
- counter <= counter + 1;
- else
- counter <= 24'd0;
- end
- end
-
- always @(posedge sys_clk or negedge sys_rst_n) //
- begin
- if(!sys_rst_n)
- led <= 3'b110;
- else
- begin
- if (counter == 24'd2400_0000) //~ 0.5s delay
- led[2:0] <= {led[1:0],led[2]};
- else
- led <= led;
- end
- end
- endmodule
通过Synthesize进行综合和配置输出引脚,如图:
最后实验结果按预想的结果出现,看到了LED的闪烁和输出的时钟信号:
本实验是在我之前买的Sipeed的Lichee Tang Nano完成的,使用Mini Star目前还没有下载成功,总是出现“cable open failed”错误,在cable setting中显示的还是*** Tang,是不是和之前安装Lichee Tang Nano的驱动冲突么?
总结:官方资料很重要,也很详细,一定要先阅读官方文档再进行编写代码。做什么事事情都从简单的开始,这样才一直有信心做下去。我做的是一个是两个月计划,成家有孩子后学习时间就少了。不过,坚持下去,把计划完成。
`