点击上方 “ 畅学电子 ” 一键关注,轻松学习电子知识
按照基于Windows的语言(C、C++、C#)等编程语言的初学入门教程,第一个历程应该是“Hello World!”的例程。但由于硬件上的驱动难易程度,此例程将在在后续章程中推出。硬件工程师学习开发板的第一个例程:流水灯,一切美好的开始。
本章将会在设计代码的同时,讲解Quartus II软件的使用,后续章节中只讲软件的思想,以及解决方案,不再做过多的累赘描述。
一、Step By Step 建立第一个工程
(1)建立第一个工程,File-New-NewQuartus IIProject,如下图所示,OK。
(2)Next,如下图所示,选择工程目录(不能有空格,中文路径),同时输入工程名与顶层文件名。
(3)若有现成的代码,可以直接选择添加入工程;否则,直接next,进入下一步,如下图所示:
(4)根据自己的硬件设施,选择相应的设备目标器件。
(5)Next,Finish。
二、工程代码设计
1. water_led_design工程文件结构:
如上图所示,工程分为三个模块,分别为:
(1)顶层模块 : 例化各个模块,工程的xx级别文件。
(2)分频模块 : 通过分频得到固定的频率(10Hz)。
(3)LED显示模块: 随固定频率,来操作LED灯。
2. 代码设计
(1)warter_led.v模块设计
a) New-File,新建verilog文件,保存于新建在工程目录下的src文件夹中(只是为了工程文件结构组织的清晰,更善于管理)。如下图所示:
b) 输入代码,定义输入输出接口,如下所示:
module water_led
(
input clk, //global clock 50MHz
input rst_n, //global clock reset
output [5:0] led_data //user led interface
);
endmodule
(2)clk_design.v模块设计
由于系统输入时钟是50Mhz,若以50MHz的速度变换LED等,人眼压根分辨不出来。因此利用分频原理,来对50MHz进行分频,而适应人眼。本模块将50MHz分频至10Hz,人眼分辨的极限是25Hz,因此10Hz能感觉得到(可以随机修改)。Led_en的频率计算公式:clk_led_en = 50_000000/(49_000000+1) = 10Hz,具体代码如下:
module clk_design
(
input clk,
input rst_n,
output led_en
);
reg [22:0] cnt; //49_99999,100ms
parameter LED_CNT = 49_999999;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt <= 23'd0;
else if(cnt < LED_CNT)
cnt <= cnt + 1'b1;
else
cnt <= 23'd0;
end
assign led_en = (cnt == 23'd49_99999) ? 1'b1 : 1'b0;
endmodule
模块没有分频产生10Hz的频率,而是生成了10Hz的使能时钟,目的是防止时钟满天飞,使得FPGA内部布局布线紊乱,影响全局功能。虽然如此简单的工程可以不用考虑,但是“习惯了严谨便成为了一种风范”,因此使用使能时钟,来对具体的时序进行操作。具体使能时钟、门控时钟的异同、优劣将会在后续章节中解说。
(3)led_display.v模块设计
根据输入的led_en使能信号,来操作led灯的效果,此处采用最简单的算法——递增进位。代码如下所示:
详见原文:http://www.eeskill.com/article/id/27815
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
==> 前往 www.eeskill.com 学习更多知识!