FPGA学习历程(二):从LED流水灯开始的惯例

以下内容中的理论部分学习自黑金 FPGA 教程。

一、顺序操作和并行操作

  顺序操作和并行操作是两种截然不同,但又容易让入门新手混乱的一个重点。而 Verilog 作为一种硬件描述语言,最大的优势恰恰就是对并行操作的支持。所以在 FPGA 的使用过程中,并行操作的学习终归是逃不掉的,为帮助理解两者的区别,这里稍微展开说明。

1.1 顺序操作

  顺序操作有一种 “步骤” 的概念,即在上一个行为没有完成前,下一个行为就不会执行;而并行操作则是使两个行为独立执行,各自之间互不影响。以一个典型的 LED 流水灯程序为例,从顺序操作的思考角度上分析,流水灯程序的执行流程分为以下几个步骤:

  • 点亮第一个 LED,延迟一段时间。
  • 点亮第二个 LED,延迟一段时间。
  • 点亮第三个 LED,延迟一段时间。
  • 重复第一个步骤。

  这就是典型的 “顺序式结构”,给人的直观感受就是有一个 “指挥者” 或者 “控制器” 的东西存在,执行着 “工作的次序”(步骤)。这种结构可以被亲切地称为 “单片机结构”,因为单片机控制中使用的 C 语言或是汇编语言都在传递着顺序操作的概念。如果适应了单片机的 “顺序操作模式”,就可能会在接触 FPGA 时不自觉地忽略掉 “并序操作” 的概念(这无异于自断一臂了)。
在这里插入图片描述

1.2 并行操作

  那么用并行操作的角度来思考呢?先上图直观感受一下:
在这里插入图片描述
在这里插入图片描述
  说得通俗一些,这里的并行操作就是把顺序操作里的控制器一分为四了,每个功能模块都有自己独自的执行主轴,它们之间互不影响。
  而从结果来看,利用 “并行操作” 实现的流水灯,在肉眼中和 “顺序操作” 并无区别,但那其实仅仅是因为人眼能够捕捉的精度误差的局限性,并不代表它们真的没有区别(这个区别经过流水灯的例子说明应该足够明显了吧)。高频扫描和任务调度器或许能够让顺序操作达到近似并行操作的效果,但本质上终究还是顺序操作。

二、流水灯实验

2.1 硬件电路

  流水灯,历来的入门经典之作,yyds!点亮方式很明显是 IO 输出高电平了。
在这里插入图片描述

2.2 Quartus II 13.1 新建工程

  打开 Quartus 软件,选择菜单 File ⟶ \longrightarrow New Project Wizerd…,然后直接 “Next” 到工程命名界面。注意路径里不要有中文和空格:
在这里插入图片描述
  第 2 页不管,在第 3 页选择好自己使用的芯片型号:
在这里插入图片描述
  之后就全是 Next 了,最后 Finish,工程就创建完成了。

2.3 编写 Verilog 代码

  这里为方便快速入门还是先按顺序操作思路实现,真正的并行操作会在后续添加了其他模块时体现(讲道理顺序的能写出来并行的应该也不会有什么问题):

/* timescale 是 Verilog 中的一种时间尺度预编译指令,它用来定义模块
** 仿真时的时间单位和时间精度。一般来说时间精度不能大于时间单位,最多
** 两者一样大。
** 时间精度就是模块仿真时间和延时的精确程序,比如定义时间精度为 10ns,
** 那么时序中所有的延时至多能精确到 10ns,而 8ns 或者 18ns 就做不到,
** 了,即只能进行 10ns 或者 20ns 之类的延时。
*/
`timescale 1ns / 1ps			    // 时间单位1ns,时间精度1ps

module top
(
	input 				sys_clk	,   // 板载系统时钟 50MHz
	input               sys_rst_n,  // 复位信号,低电平有效

	output  reg [3:0]   led         // 总共4个led
);

reg [31:0]  timer;                  // 延迟计数器

always@(posedge sys_clk or negedge sys_rst_n)   // 时钟上升沿或者复位信号下降沿触发
begin
    if (sys_rst_n == 1'b0)
    timer <= 32'd0;                             // 复位清零
    else if (timer == 32'd199_999_999)          // 计时 4s:50M * 4 - 1 = 199999999
        timer <= 32'd0;                         // 计数器溢出清零
    else
        timer <= timer + 32‘d1;                 // 计时原理就是计系统时钟的周期数量
end

// 顺序操作思路下的流水灯实现
always@(posedge sys_clk or negedge sys_rst_n)
begin
    if (sys_rst_n == 1'b0)
		led <= 4'b0000;
	else if (timer == 32'd49_999_999)
		led <= 4'b0001;
	else if (timer == 32'd99_999_999)
		led <= 4'b0010;
	else if (timer == 32'd149_999_999)
		led <= 4'b0100;
	else if (timer == 32'd199_999_999)
		led <= 4'b1000;
end

endmodule 

2.4 其他设置

  • 将 Verilog 文件编写并添加到工程后,需要将其设置为顶层实体。设置方法为:选中 Verilog 文件单击右键 ⟶ \longrightarrow Set ad Top-Level Entity。
    在这里插入图片描述
  • 设置未用管教和默认电平标准:把没有使用的管脚作为三态输入、默认电平标准设置为3.3V LVTTL、多用途管脚设置。进入方法:选择菜单 Assignments ⟶ \longrightarrow Device… 打开之前新建工程时的那个页面,可以看到这里的中间位置多了一个选项设置。
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

2.5 预编译

  之后就可以进行分析与综合了,也就是让 Quartus 分析设计中的输入输出管脚,在编译过程中通过下方的信息显示窗口输出检查情况。位置在菜单栏下图所示的位置:
在这里插入图片描述
  编译顺利完成后会弹出 FPGA 资源使用情况,同时左下角会有一个绿色的 ✔:
在这里插入图片描述

2.6 管脚分配

  接下来管脚进行绑定。有两种方法,一种直接把引脚拖到图上,另一种则是在规划表中键入指定位置进行绑定(绑定完无需保存,可直接关闭 Pin Planner)。引脚可看原理图,也可看用户手册。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:每个 IO 都必须分配管脚,如果有未分配的 IO,软件可能会随机分配,造成不可预料的后果,严重时可烧坏 FPGA 芯片。

PS:这个表格可以像 Excel 表格一样复制粘贴可以从其他工程的管脚分配复制过来,然后粘贴,也可以在一个 Excel 表格里复制过来。 管脚分配完成以后关闭窗口就可以。

2.7 编译下载

  最后是全编译。从之前的图示中可以看到左下角实际上只有分析与综合一栏有绿色的 ✔,其他位置并没有。全编译就是给所有栏都 ✔ 上(如果设计没有问题的话):
在这里插入图片描述
在这里插入图片描述
  再次完成编译后,下载程序,也就是 output_files 文件夹下的 sof 文件到开发板(话说这开发板是下载和供电分开的,开始没怎么注意看以为和单片机一样二合一了orz)。下载时先插下下载器的 JTAG 排线,然后再上电。
在这里插入图片描述
在这里插入图片描述
  正常情况下弹出的窗口 Mode 已经选择 JTAG 模式,下载器已经识别到了,并且下载文件都已经找好(没找好就老老实实自己找吧)。 需要注意的是:芯片型号跟开发板必须一致,否则会无法下载;下载的 sof 文件一次只能添加一个。 一切正常,点击 “start” 按钮,进度条开始滚动,遇到错误时, Quartus 信息窗口会显示出具体的错误。
在这里插入图片描述

2.8 固化程序到 Flash

  上述下载过程并未将程序固化到 Flash,要是开发板断电的话就需要重新下载程序。要使FPGA上电自动加载程序,则需要手动转换 sof 文件 为 jjc 文件。转换方法:选择菜单 File ⟶ \longrightarrow Convert Programming Files…,选择好对应的 FPGA 板卡使用的 Flash 规格以及要转换成的文件:
在这里插入图片描述
  然后选中下方的 Flash Loader ⟶ \longrightarrow Add Devide…,勾选对应的 FPGA 芯片型号:
在这里插入图片描述
  再选中 SOF Data ⟶ \longrightarrow Add File…,选择要转换的 sof 文件,点 “Generate” 就可以生成 jjc 文件了:
在这里插入图片描述
  最后在下载 jjc 文件的时候记得勾选一下 Program/Configure 选项:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值