您现在的位置是:主页 > news > 下载学校网站模板下载/谷歌浏览器chrome官网
下载学校网站模板下载/谷歌浏览器chrome官网
admin2025/6/1 8:38:40【news】
简介下载学校网站模板下载,谷歌浏览器chrome官网,怎么给一个网站做seo,城阳做网站找哪家好文章目录项目一:1位闪烁灯设计第一节 项目背景第二节 设计目标第三节 设计实现3.1 顶层信号3.2 信号设计3.3 信号定义第四节 综合和上板4.1 新建工程4.2 综合4.3 配置管脚4.4 再次综合4.5 连接开发板4.6上板第五节 modelsim仿真项目一:1位闪烁灯设计 第…
文章目录
- 项目一:1位闪烁灯设计
- 第一节 项目背景
- 第二节 设计目标
- 第三节 设计实现
- 3.1 顶层信号
- 3.2 信号设计
- 3.3 信号定义
- 第四节 综合和上板
- 4.1 新建工程
- 4.2 综合
- 4.3 配置管脚
- 4.4 再次综合
- 4.5 连接开发板
- 4.6上板
- 第五节 modelsim仿真
项目一:1位闪烁灯设计
第一节 项目背景
发光二极管(Light Emitting Diode,LED)是一种能够将电能转化为可见光的固态半导体器件,其核心是一个整个被环氧树脂封装起来的半导体晶片。晶片的一端附在一个支架上为负极,另一端连接电源为正极。
半导体晶片由 P 型半导体和 N 型半导体两部分组成,其中 P 型半导体中空穴占主导地位,而 N型半导体的主要部分是电子。当这两种半导体连接起来时,两者之间形成了一个 P-N 结。当电流经由导线作用于该半导体晶片时,自由电子从 N 型区扩散到 P 型区跟空穴复合,其会以光子的形式发出能量,这就是 LED 灯产生光源的原因。光的波长即为 LED 的灯光颜色,其由形成 P-N 结的材料决定,不同的材料可以使 LED 可以发出不同颜色的光。随着研究的深入,如今 LED 已经可以直接发出红、黄、蓝、绿、青、橙、紫、白色等多种颜色的光。
LED 起初被用作仪器仪表的指示光源,后来各种光色的 LED 在交通信号灯和大面积显示屏中得到了广泛应用并产生了很好的经济效益和社会效益。以 12 英寸的红色交通信号灯为例,美国原本使用的光源是长寿命、低光视效能的 140 瓦白炽灯,可产生 2000 流明的白光。但是经红色滤光片后,光损失率高达 90%,只剩下 200 流明的红光。而 Lumileds 公司采用 18 个红色 LED 光源后发现:在产生同样光效的前提下,该类光源包括电路损失在内共耗电 14 瓦,与传统白炽光光源相比耗能减少了十倍,这一光源的使用为社会做出了巨大贡献。除此之外汽车信号灯也是 LED 光源的重要应用领域之一。
而在日常生活中人们往往更需要白色光源以满足照明需求,1998 年基于这一需求成功开发了发白光的 LED,这种 LED 将 GaN 芯片和钇铝石榴石(YAG)封装在一起做成。其中 GaN 芯片发蓝光(λp=465nm,Wd=30nm),高温烧结制成的含 Ce3+的 YAG 荧光粉受此蓝光激发后发出黄色光射,其峰值为 550nm。蓝光 LED 基片安装在碗形反射腔中,覆盖以混有约 200-500nm 的 YAG 树脂薄层。
LED 基片发出的一部分蓝光被荧光粉吸收,另一部分蓝光与荧光粉发出的黄光混合,从而可以得到白光。对于 InGaN/YAG 白色 LED,通过改变 YAG 荧光粉的化学组成和调节荧光粉层的厚度,可以获得色温 3500-10000K 的各色白光。这种通过蓝光 LED 得到白光的方法,构造简单、成本低廉、技术成熟度高,因此运用最为广泛。
基于 LED 灯的原理,本书制作了 1 位闪烁灯工程,感兴趣的话可以根据步骤自己进行实操联系。从图 3.1-49 开发板 LED 原理图可以看到,至简设计法的教学板一共有 8 个可以发出绿光的 LED 灯。
图中左边的 LED1~LED8 是教学板上 LED 灯的丝印,右边的 LED1~LED8_NET 为信号线名。
此标注是为了更好的理解设计,而在实际的开发板中不显示这些信号线。
LED 灯两端分别连接了 3.3V 的高电平和 LED1~LED8_NET 信号线。当 LED1~LED8_NET 为高电平时,电流无法导通,LED 灯不发光;反之,当 LED1~LED8_NET 是低电平时,电流流通,此时 LED 灯发光。因此只要控制了信号 LED1~LED8_NET 的电平情况,就相当于控制了 LED 灯发光
的情况。
那么信号线LED1~LED8_NET又连到哪里呢?从下图可以发现这些信号都连接到了FPGA的管脚上。
表 3.1-1LED 和 FPGA 管脚关系为开发板上实际信号管脚的对应关系,例如信号线 LED1 连接到了 FPGA 的 AA4 管脚上。
从表中可以看到 LED1~LED8_NET 分别与 FPGA 的 8 个管脚相连,因而LED1~LED8_NET 处于高低电平以及 LED 灯是否发光最终取决于 FPGA 管脚的输出。
举例说明,如果想要控制 LED7 号灯,只需调整 LED7 连接的 FPGA 管脚 AB14 的输出就可以了。当输出为高电平时 LED7 灯灭,当输出为低电平,LED7 灯亮。8 个 LED 灯各自对应一个管脚,因此这 8 个 LED 灯都是由 FPGA 独立进行控制。
第二节 设计目标
确定设计的功能目标是至简设计法的一大特别之处,只有对设计的功能目标有一定的理解和预期,才能进一步地讨论如何进行代码设计和实现。也就是说,后续设计中每一个步骤都是围绕着设计目标的实现来针对性的展开。如果对于设计目标一知半解,连最终想要什么都无法确定,那么后续设计的思路就难以形成体系化的思考模式,只能一味接收碎片式的知识。设计目标就像大楼的设计图,
如果想要掌握完整的案例设计,需要静下心来从明确设计目标开始一步步细细咀嚼,逐步掌握,才可以真正做到事半功倍。因此,在每个设计前本书会确定设计的功能目标,从而更好的完成设计。
本工程使用 1 个 LED 灯(LED1)来实现闪烁灯功能。工程的工作时钟为 50MHz,即时钟周期为 20ns。当 LED1 连接的管脚 AA4 输出低电平时,LED1 灯亮,输出高电平时,LED1 灯灭。具体功能要求为:隔 1 秒,亮 N 秒。N 的变化为:1,2,3,……,9 秒,之后再次进入循环,如图 3.1- 51 1 位闪烁灯功能图。上板后的效果展示可参见图 3.1-52 1 位闪烁灯的效果图。可以登录至简设计法官方网站观看上板后的演示视频:www.mdy-edu.com/xxxx。
第三节 设计实现
下面会详细地介绍本设计的实现方法并对一些基本的设计理念和思路进行详细地说明。如果已经基本掌握至简设计法理念,且有一定独立实操基础,可以选择直接跳至第五节“简化版步骤分享”按照步骤进行设计实操。当然,还是建议初学者打好基础,按照分析一步步掌握思想原理后再按照操作步骤反复实践练习
3.1 顶层信号
新建目录:D:\mdy_book\mdyBookMyLed,并在此目录中新建一个名为 mdyBook_MyLed.v 的文件。用 GVIM 打开该文件后开始编写代码。
在这里建议初学者按照本书提供的路径名和文件名使用,不要进行其它更改。因为在更改过程中可能会出现中文路径、空格路径等非法路径的问题,或者有些文件名更改后会出现报错等现象,而初学者并不能很好地发现并解决这些问题。因此建议先按照要求更名保存,在多次进行工程练习,熟悉了各个步骤后,再进行更名的操作。这个地方不要想当然,按部就班地细心操作就会可以避免后续问题的出现。
下面来确定顶层信号。由设计目标可知,想要控制 1 个 LED 灯亮或灭需要 FPGA 产生一个信号。假定这一信号为 led,将其连接到 LED 灯上。如果要控制 LED 灯灭,FPGA 将信号 led 输出为 1,控制 LED 灯亮,FPGA 将信号 led 输出为 0。硬件电路图的连接关系如图2 所示,可以看到本工程中 LED1 灯连接的 FPGA 管脚为 AA4,对应的 FPGA 工程信号为 led。工程的时钟管脚为 G1,对应 FPGA 工程信号为 clk。工程的复位管脚为 G1,对应 FPGA 工程信号为 rst_n。由此可见,工程中一共需要三个信号:时钟 clk,复位 rst_n 以及输出信号 led。
将 module 的名称定义为 mdyBookMyLed,在顶层信号代码中需要将与外部相连接的输入/输出信号列出,从而实现信号与管脚的连接,具体顶层信号代码如下:
随后对信号的输入输出属性进行声明,指出对于 FPGA 来说这一信号属于输入还是输出,若为输入,声明则为 input,若为输出,声明则为 output。在本设计中,由于 clk 是外部晶振输送给 FPGA 的,因此在 FPGA 中 clk 为输入信号 input。同样地,rst_n 是外部按键给 FPGA 的信号,因此在 FPGA 中 rst_n 也为输入信号 input。同时可知 led 是 FPGA 输出控制 LED1 显示的,因此 led 为输出信号 output。其具体声明代码如下:
3.2 信号设计
随后需要对架构进行设计。首先将项目实现功能用波形图表示出来,详细的分析一下设计需求。LED 灯的变化规律是暗 1 秒,亮 N 秒,其中 N 的变化为:1、2、3、……、9 秒,然后再次从 1 秒开始循环。将此现象转换为信号,即为信号 led=1 持续 1 秒后信号 led=0 持续 N 秒,其中 N 的变化是:1、2、3、……、9 秒,如图 3.1-53 所示。可以看出在第一次亮暗过程中,led=1 持续暗了 1 秒后 led=0 持续亮了 1 秒,共计 2 秒时间。在第二次亮暗过程中,led=1 持续暗了 1 秒后 led=0 持续亮2 秒,共计 3 秒时间。以此类推,到第 9 次时,led=1 持续 1 秒后 led=0 持续了 9 秒,共计 10 秒时间。随后以此为规律进行循环往复。
根据波形图可以完成本项目计数器的架构设计。本项目一共需要两个计数器,其中一个计数器用来计算时间,另一个用来计算次数。本书使用计数器 cnt1 来记录次数变化,另一个计数器 cnt0 来记录每一次的工作时间,这样做会方便后续的代码设计。在这里来思考一下,为什么不能只用一个时间计数器,按照 2 秒、5 秒、9 秒、14 秒……这样增加秒数的方法来进行设计呢?在实际的代码操作中,这样设计虽然只使用了一个计数器,但其计算方法却是非常麻烦的。举个生活中常见的例子,如下图所示,把每一次的循环看做楼层,把每一秒的计数看做门牌号。按照一种计数模式来计数的话,若一楼的门牌号为 1、2、3、4、5、6、7、8,二楼的门牌号则为 9、10、11、12、13、14、15、16、17、18,后续楼层以此类推。按照这种方式进行计数,如果需要寻找到 47 号房间,可能需要动脑筋计算很久才可以定位到。反之,使用两种计数模式:一个计数器对应楼层,另一个对应门牌号。那么一楼的门牌号则为一楼的 1、2、3、4、5、6、7、8,二楼的门牌号为二楼的 1、2、3、4、5、6、7、8、9、10,以此类推。一共有多少层,每一层都有对应的房间号就会一目了然。假如想要寻找六层7号房间就会轻而易举。同样的道理,在本工程设计中使用一个计数器表示次数,另一个计数器表示时间,这样在后续遇到问题时就可以快速的找到问题代码,而无需逐个推算。图 3.1-54 门牌号计数示例同样是上面的案例,如果想要寻找每一层的固定位置房间,同样可以利用两种计数模式:用 cnt0 来表示房间号,其范围是 0-9,用 cnt1 来表示楼层号,其范围是 0-1。利用这一方法可以通过 cnt0
和 cnt1 两个计数器来找到任何一个房间。这样做的另一好处是:如果想找到同一个位置的房间,就可以直接用 cnt0 来统一进行表示。例如 cnt0==4 可以统一表示每层楼的四号房间。而在只有房间号这一单一计数模式而没有楼层计数的情况下,如果想表示每层楼的四号房间则需要表示方式为“cnt0==4”、“cnt0=12”,
更高楼层以此类推。两种表现形式的难易程度显而易见。借鉴同样的思想用于 LED 灯的设计工程中,根据目标可知需要 LED 灯第 1 秒不亮,而后面 N秒亮,循环往复。从波形图中也可以看出任何一次亮暗都是在第一秒结束的节点拉低,依据使用两个计数单位的方法,统一将每次循环的第一秒表示为“add_cnt0 && cnt0==50_000_000-1”。
在这种无限循环的工程中,数据会像滚雪球一样越滚越大,此时只要一个节点出现了问题,就需要花费大量的时间去查找修复。通过增加一个次数计数器的方法将此项目闭合在一个固定的循环中就可以巧妙的避开了这一问题,大大减轻了排查错误的难度。学会这种思考方式后在对项目进行顶层设计时可以更加全面的考虑问题,从而为项目选择最合适的展现形式。
回到本项目中,本项目采用计数器 cnt0 来计算时间,如计 2 秒、3 秒等。工作时钟为 50MHz,即周期为 1s/50MHz=20ns,通过时间换算关系可知 2s=2_000_000_000ns,因此当计数器计数到 2_000_000_000/20=100_000_000 个时就代表着 2 秒时间到了。按照此方法依次类推,在第 2 次亮暗控制时计数器数到 150_000_000 个时代表计时 3 秒。第 4 次亮暗控制时数到 200_000_000 个时代表计时 4 秒……,第 9 次时,数到 500_000_000 个时就表示 10 秒时间计时结束。
前文讨论中说明了本设计需要 2 个计数器,现在就来讨论一下每个计数器的实现方法。至简设计法的设计规则中有讲过,计数器的设计只考虑两个因素:加 1 条件和计数数量。只要确定好相应逻辑,就能完成计数器代码设计。
首先来讨论时间计数器 cnt0 的加 1 条件:该计数器始终不停地进行计数,因此可以认为其加 1条件是一直有效的,可写成:assign add_cnt0==1
。
可能会有同学提出疑问:加 1 条件的概念是什么?这里以停车位来进行比喻,一般情况下对每个停车位置会进行对应编号,但是如果某个位置上放置了一块石头无法作为停车位时,该位置就不能获得对应的编号。反之则可以认为停车位编号的加 1 条件就是:对应位置上没有石头,其可以继续进行编号,即 assign add_cnt0 = “没有石头”。因此如果在设计中计数器一直没有阻碍地进行计数工作,就可以认为加 1 条件是一直有效的。
下面讨论一下时间计数器 cnt0 的计数数量:由于第 1 次到第 9 次的亮暗控制中每次计数的时间都各不相同,因此可以考虑使用变量法。在设计中变量法的选用逻辑非常简单:当循环周期的个数不同时就可以选择变量法来进行设计。本设计中使用 x 表示计数器 cnt0 的计数数量,后续会对 x 的值进行详细展开。
进行代码编写这一步骤时,以往都是一行行的输入相应代码。至简设计法在这里提供一个小技巧,在节省编写代码的时间的同时在一定程度上降低了代码的出错率。至简设计法将日常代码中常用到的固定部分制作成模板,进行代码编程时可以调用相应模板后根据逻辑输入对应设计的变量将代码补充完整。这里就使用模板编写计数器代码,学习一下这个炫酷的功能。打开 GVIM 工具,在命令模式下输入“:Mdyjsq”后点击回车就调出了对应模板,如下图所示。之后再将本案例中的变量填到模板里面,就可以得到完整正确的计数器代码。
按照上文方法,可以得到该时间计数器的代码如下:
同样的,需要确定次数计数器 cnt1 的加 1 条件和计数数量:可以看到每当 cnt0 完成一个周期后计数器 cnt1 就会加 1,因此 cnt1 的加 1 条件即为 cnt0 的结束计数,其代码表示为 end_cnt0。此外,从设计目标中可以得知每一周期内次数计数器 cnt1 的计数数量为 9。
在这里可以继续调用模板,在 GVIM 的命令模式下输入“:Mdyjsq”后点击回车调用对应模板后将“add_cnt1”和“end_cnt1”补充完整,得到代码为:
确定好两个计数器后来思考一下输出信号 led 的变化。从设计目标可以得知 led 有两个变化点:变 0 和变 1。变 0 的原因均为时间计数器完成到 1 秒计数,也就是当 cnt0 数到 1_000_000_000/20=50_000_000 个时,计时 1 秒结束,此时 LED1 灯为灯灭状态。设计目标规定灯暗一秒后亮灯,即此时 led 信号变为 0。同理,变 1 是因为完成了亮灯的 N 秒时间,相应计数器完成了计数,即 end_cnt0。
依旧使用至简设计法模板,在 GVIM 编辑模式下输入“Shixu2”回车,调出模板,得到 led 信号的代码如下:
最后来思考一下计数器 cnt0 的计数数量 x。前文中提到这种循环周期变化的情况要采用变量法来完成设计,下面先同样以楼房门牌号为例来辅助思考。假设楼房的第一层为八个房间,第二层为十个房间,第三层为十五个房间,第四层为二十个房间。如果想要用代码将这种实际情况表示出来,需要使用至简设计法中的组合逻辑模板,在编辑模式下输入“Zuhe”后回车,填写对应条件后得到最终代码如下:
这里的代码设计需要着重学习一下,可以看到至简设计法写出的代码非常的整洁,逻辑思维一目了然,这种写法可以做到资源最优,并且不会出现 BUG,自己实操的时候可以使用这种写法。同样的道理,在讨论时间计数器 cnt0 的时候曾经得出结论:“计数器计数到2_000_000_000/20=100_000_000 个时就代表着 2 秒计时结束。按照此方法依次类推,在第 2 次亮暗控制时计数器数到 150_000_000 个时代表 3 秒计时结束。第 4 次亮暗控制时数到 200_000_000 个时代表 4 秒计时结束……,至第 9 次时,数到 500_000_000 个时代表 10 秒计时结束。”,从中可以看出 cnt0 的计数数量与 cnt1 有关。第 1 次计数数量为 100_000_000,第 2 次计数数量为 150_000_000……,按照这样的规律可以将 9 次亮暗对应的 x 都表示出来。在 GVIM 的编辑模式下输入“Zuhe”后回车,将对应条件补充完整后得到 x 的赋值代码如下:
至此,本设计的主体程序已经完成。回顾一下思考过程可以发现:设计的每一步都是按照设计目标逐步展开,看似是在讨论每个小问题,但其实都是围绕设计目标进行讨论,这也是本书最开始强调制定和理解设计目标的重要性的原因。
主体完整代码如下:
module mdyBookMyLed(clk,rst_n,led);input clk;input rst_n;output led;
/***计数器cnt0计算时间***/
always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt0<=0;endelse if(add_cnt0)beginif(end_cnt0)cnt<=0;elsecnt0<=cnt0+1;end
end
assign add_cnt0 = 1;
assign end_cnt0 = add_cnt0&&cnt0==x-1;
/***第二个计数器计数次数***/
always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt1<=0;endelse if(add_cnt1)beginif(end_cnt1)cnt1<=0;elsecnt1<=cnt1+1;end
end
assign add_cnt1 = end_cnt0;
assign end_cnt1 = add_cnt1 && cnt1==9-1;
/***led亮灭信号控制****/
always @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled<=1;endelse if(add_cnt0&&cnt0==50_000_000-1)beginled<=0;endelse if(end_cnt0)beginled<=1;endend
/****变量x控制*****/
always @(*)beginif(cnt1==0)beginx=100_000_000;endelse if(cnt1==1)beginx=150_000_000;endelse if(cnt1==2)beginx=200_000_000;endelse if(cnt1==3)beginx=250_000_000;endelse if(cnt1==4)beginx=300_000_000;endelse if(cnt1==5)beginx=350_000_000;endelse if(cnt1==6)beginx=400_000_000;endelse if(cnt1==7)beginx=450_000_000;endelse beginx=500_000_000;end
end
/******至此项目主体程序已经结束****/
3.3 信号定义
下面需要将 module 补充完整,首先要做的是定义信号的类型。在判断信号类型时会感到很困惑,搞不清楚如何确定 reg 和 wire。其实大多数的困惑是因为联想的太多,例如认为 reg 就是寄存器,wire 是线,或者认为 reg 类型会综合成寄存器,wire 类型不会综合成寄存器,然而实际上这些与信号是reg 型还是 wire 型都并无关系。至简设计法建议不要进行任何联想,只遵从一个规则“用 always 实
现的是 reg 型,其他都是 wire 型”。进行信号定义时,除了信号的类型,还需要确定信号的位宽。至简设计法在这里分享一个非常实
用的获取信号位宽的技巧:打开计算器,点击“查看”,选择“程序员”模式,在“十进制”下输入数字后就会获得对应的信号位宽。
cnt0 是用 always 产生的信号,因此类型为 reg。根据前文计算可知 cnt0 计数的最大值为 500_000_000,根据至简设计法的实用技巧,打开计算器后在程序员模式十进制下输入 500_000_000,如下图所示。可以看出,信号的位宽为 29。
综上所述 cnt0 的定义代码如下:
同样的,cnt1 也是用 always 产生的信号,因此类型为 reg。cnt1 计数的最大值为 8,需要用 4根线表示,即位宽是 4 位。编辑模式下输入“Reg4”调用至简设计法模板,补充完整后得到代码表示如下:
add_cnt0 和 end_cnt0 都是用 assign 方式设计的,因此类型为 wire。其值是 0 或者 1,用 1 根线表示即可,即位宽为 1。编辑模式下输入“Wire1”调用至简设计法模板,补充完整后得到代码表示如下:
同样的,add_cnt1 和 end_cnt1 也是用 assign 方式设计的,类型为 wire。其值是 0 或者 1,位宽为 1。编辑模式下输入“Wire1”调用至简设计法模板,补充完整后得到代码表示如下:
led 是用 always 方式设计的,因此类型为 reg。led 信号值是 0 或者 1,1 根线表示即可。编辑模式下输入“Reg1”调用至简设计法模板,补充完整后得到代码表示如下:
x 是用 always 方式设计的,因此类型为 reg。其最大值为 500_000_000,需要用 29 根线表示,即位宽为 29。需要注意的是:这里的 x 是使用组合逻辑设计的,综合结果也不会有寄存器,但是遵循刚刚提到的信号判断原则,x 是用 always 设计出来的,所以依旧使用 reg 型来进行定义。代码表示如下:
至此,整个代码的设计工作已经完成。完整版的工程代码如下:
module mdyBookMyLed(clk,rst_n,led);
input clk;
input rst_n;
output led;reg [28:0] cnt0;
reg [3:0] cnt1;
wire add_cnt0;
wire end_cnt0;
wire add_cnt1;
wire end_cnt1;
reg led;
reg [28:0]x;/***计数器cnt0计算时间***/
always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt0<=0;endelse if(add_cnt0)beginif(end_cnt0)cnt<=0;elsecnt0<=cnt0+1;end
end
assign add_cnt0 = 1;
assign end_cnt0 = add_cnt0&&cnt0==x-1;
/***第二个计数器计数次数***/
always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt1<=0;endelse if(add_cnt1)beginif(end_cnt1)cnt1<=0;elsecnt1<=cnt1+1;end
end
assign add_cnt1 = end_cnt0;
assign end_cnt1 = add_cnt1 && cnt1==9-1;
/***led亮灭信号控制****/
always @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled<=1;endelse if(add_cnt0&&cnt0==50_000_000-1)beginled<=0;endelse if(end_cnt0)beginled<=1;endend
/****变量x控制*****/
always @(*)beginif(cnt1==0)beginx=100_000_000;endelse if(cnt1==1)beginx=150_000_000;endelse if(cnt1==2)beginx=200_000_000;endelse if(cnt1==3)beginx=250_000_000;endelse if(cnt1==4)beginx=300_000_000;endelse if(cnt1==5)beginx=350_000_000;endelse if(cnt1==6)beginx=400_000_000;endelse if(cnt1==7)beginx=450_000_000;endelse beginx=500_000_000;end
end
/******至此程序已经结束****/
第四节 综合和上板
上一节完成了代码的设计,接下来需要对其进行综合以及上板调试。
4.1 新建工程
打开软件 Quartus Ⅱ,点击 File 下拉列表中的 New Project Wzard…新建工程选项,如图 3.1- 57 所示。
随后如下图所示的 Quartus 新建工程介绍,直接点击“Next”。
此时会出现工程文件夹、工程名、顶层模块名设置界面,如错误!未找到引用源。11 所示。
注意目录为:D:/mdy_book/mdyBookMyLed,工程名和顶层名为 mdyBookMyLed。
这里再次进行强调,为了避免初学者使用过程中出现报错情况,强烈建议按照本书的工程名和文件名进行设置,设置完成后点击 Next。
新建工程类型设置选择“Empty project”,如下图所示,然后点击“Next”。
文件添加界面如图 3.1-61 所示,此时添加之前写的“mdyBookMyLed.v”文件,点击右侧的“Add”按钮后文件会在下方显示出来,随后点击“Next”。
文件添加界面如图 3.1-61 所示,此时添加之前写的“mdyBookMyLed.v”文件,点击右侧的“Add”按钮后文件会在下方显示出来,随后点击“Next”。
芯片型号选择界面如图 3.1-62 所示,选择“Cyclone ⅣE”,在芯片型号选择处选择“EP4CE15F23C8”,然后点击“Next”。
QUARTUS 设置工具界面如图 3.1-63 所示,不必要修改,直接点击“Next”。
图 3.1-65 中可以看到新建工程的汇总情况,点击“Finish”,完成新建工程。
4.2 综合
新建工程步骤完成后,QUARTUS 界面如下图所示。
点击编译按钮,可以对整个工程进行编译,编译成功后的界面如图 3.1-66 所示。
4.3 配置管脚
下面需要对相应管脚进行配置。如图 3.1-67 所示,在菜单栏中选中 Assignments 后选择 Pin Planner,随后配置管脚的窗口就会弹出。
在配置窗口最下方中的 location 一列,按照表 3.1-2 中最右两列进行 FPGA 管脚的配置。此处配置管理来源的选择在最开始的管脚配置设计环节中有进行讲解,最终配置的结果见图 3.1-68。
配置完成后关闭“Pin Planner”,软件自动会保存管脚配置信息。
4.4 再次综合
再次打开“QUARTUS”软件,在菜单栏中选中“Processing”,然后选择“Start Compilation”,再次对整个工程进行编译和综合,如图 3.1-69 所示。
当出现图 3.1-70 时说明编译综合成功。
4.5 连接开发板
完成编译后开始进行上板调试操作,首先进行开发板的连接。按照图 3.1-71 中的方式将下载器接入电脑 USB 接口,接上开发板电源后按下开发板下方蓝色开关。
4.6上板
单击图 3.1-72QUARTUS 界面中的
按钮,弹出配置界面。
随后点击 add file 后添加.sof 文件,之后点击“Start”,在“Progress”会显示出进度。
如图 3.1-73 所示,“Progress”进度条中提示成功后即可在开发板上观察到相应的现象。可以看到开发板上的 LED 灯开始闪烁,并且按照亮一秒灭一秒,亮两秒灭一秒的规律进行循环闪烁。当观察到开发板上的 LED 灯可以照常闪烁,并且在亮九秒灭一秒后又回到亮一秒灭一秒的循环时就可以判断此次实验成功。如果出现 LED 灯不亮或者不能按照规律进行闪烁等情况时,需要回头思考检查问题的出现点,建议可以多进行几遍操作,不要粗心,找到错误点后进行改正。
第五节 modelsim仿真
编写测试代码如下:
module tb_my_led;parameter CYCLE = 20;
reg clk;
reg rst_n;
wire led; my_led uut(. clk (clk),. rst_n (rst_n),. led (led)
);initial beginclk = 0;forever#(CYCLE/2)beginclk=~clk;end
endinitial begin#1;rst_n = 0;#(10*CYCLE);rst_n = 1;
endendmodule
用Modelsim去添加文件仿真得结果:
找到编写文件的并加载。