tag 标签: 小梅哥

相关帖子
相关博文
  • 热度 35
    2016-3-21 15:43
    1669 次阅读|
    35 个评论
          各位EDNChina的网友,一晃,小梅哥已经大半年没来EDNChina发表博客了。回顾上一次发表博客,还是在15年6月20号。如今,已经16年了。这段日子,并不是我懈怠了,不愿意写东西了,而是太忙,每天忙着设计调试开发板,录制视频教程,进行技术支持,实在是无法分身。年底了,各个学生也都放假回家了,公司的项目也做的差不多了,终于有时间再来EDNChina侃侃大山了。       首先介绍下这半年来我都做了些什么吧。记得曾经,我说过我想设计一款FPGA开发板,并给出了初步设想,如今,进过半年的努力,开发板已经成功设计并量产,从9月8号到今日,首批200套几近售罄。另外,为了让更多的喜爱FPGA,却学习的很艰难的朋友能够快速掌握好正确的FPGA设计方法,小梅哥经过精心准备,结合之前做培训的经历经验,录制了一系列的视频教程,从基础到深入,真正意义上的手把手教学,展示开发中的每一个细节。每一集视频教程都是现场讲解理论,分析架构,现场编写代码,编写testbench,仿真测试,板级验证。力争做到只要用户跟着视频走,就一定能够掌握。同时,为了让观看者都能有一个最佳的体验,视频采用1280*720分辨率录制,方便朋友们一边使用手机观看,一边对着电脑操作。视频全部使用专业软件与硬件录制和编辑,并进行了音频处理,保证音质清晰洪亮无杂音,给每一个朋友最好的观看体验。目前,视频教程前20讲,也就是基础部分已经录制并编辑完毕。后期提高课程和工程课程正在积极准备素材中,相信不久就会与大家见面。        忘了介绍,我们的团队,现在叫做“芯航线”。       回顾这半年,每天既做研发,又做调试,还要当采购,做美工,搞宣传,进行技术支持,售后,真真切切的感受到了创业不易。未来,小梅哥还将投入更多的精力在教程上,让更多希望学习FPGA的朋友能够踏实入门。       为感谢EDNChina一直以来的关怀,这里,小梅哥特附上目前已经制作好的20集视频教程下载链接以及课堂中的源码工程文件。如果认为小梅哥讲的不错的,请记得在博客下给个评价,小梅哥需要你们的支持。非常感谢。 全部开源视频教程下载地址: http://pan.baidu.com/s/1kUs0vkF 视频教程中配套源码下载地址: http://pan.baidu.com/s/1qX5hz9y     01 、科学的开发流程 本集是视频教程第一讲,主要通过一个实例简单演示FPGA开发的基本流程。本人也是自学过两年FPGA,并参加了国内某专业的FPGA培训机构100天就业培训,并最终留任授课3个月。因此十分清楚了解各位学习者在刚开始学习FPGA时的各种苦闷。因此希望通过这样一个视频教程,把较为科学的FPGA学习方法和思想传递给大家。 如果大家所认为的FPGA开发流程就是编码、下载、调试,那么你就该好好的看下这个视频教程了,因为我也正是被这种错误的学习方式耽误了好久好久,直到参加了培训学习才知道,仿真验证才是FPGA开发的重中之重,现在的我进行FPGA开发,板级调试时间占不到整个开发过程的5%,并不是我不重视板级调试,而是因为通过完整的理论验证之后,下载到板级上基本不会出现任何问题。科学的学习方法尤为重要,希望大家一定要注意这一点。我也曾在工作中遇到很多人,就算是我手把手的教他仿真、写testbench,他也不愿意弄的情况,因此我只想在这里说,不仿真,永远无法掌握FPGA时序设计的要点,做设计永远是事倍功半。 02 、 3-8 译码器设计验证 本集是视频教程第二讲,主要通过3-8译码器的设计实现与验证,讲解Verilog基础语法,并复习FPGA开发的基本流程。希望通过这样一个视频教程,带领大家进一步熟悉FPGA的开发流程。 课程以实现3-8译码器的设计为起点,手把手演示工程创建,设计输入以及仿真验证,让每一个0基础的朋友都能快速跟上节奏。另外,有一定基础的朋友,其实也可以观看,因为在设计中,我已经将很多的设计小技巧穿插在视频中了。请明白:实现3-8译码器不是目的,目的是学习开发流程和基本技巧。 03 、二进制计数器设计验证 本集是视频教程第三讲,主要通过FPGA数字逻辑设计中最常用的一个模块——二进制计数器的设计实现与验证,讲解Verilog基础语法,并复习FPGA开发的基本流程。希望通过这样一个视频教程,带领大家进一步熟悉FPGA的开发流程,并体会计数器在FPGA系统中的重要地位。 课程以实现二进制计数器的设计为起点,手把手演示工程创建,设计输入以及仿真验证,让每一个0基础的朋友都能快速跟上节奏。另外,有一定基础的朋友,其实也可以观看,因为在设计中,我已经将很多的设计小技巧穿插在视频中了。请明白:实现二进制计数器不是目的,目的是学习开发流程和基本技巧,并体会FPGA数字系统设计中常用的时间控制方式。 04 、高性能计数器 IP 核使用 本集是视频教程第四讲,主要通过演示FPGA数字逻辑设计中除Verilog代码方式设计外另外一种最常用的设计方式——使用IP核进行系统设计。本教程讲解了如何在Quartus II软件中调用一个基本的免费IP核——计数器IP核,并编写Testbench对IP核进行仿真验证,以教会大家如何正确科学的使用一个成熟的IP核。希望大家通过这样一个视频教程,感受到使用IP核进行系统设计的便捷性。 课程以学习使用计数器IP核为起点,手把手演示工程创建,IP核调用、Testbench编写以及仿真验证,让每一个0基础的朋友都能快速跟上节奏。另外,有一定基础的朋友,其实也可以观看,因为在设计中,我已经将很多的设计小技巧穿插在视频中了。请明白:学会使用计数器IP核不是不是目的,目的是感受使用IP核进行设计的便捷性。 05 、 BCD 码计数器设计验证 本集是视频教程第五讲,主要讲解数字系统,尤其是时钟系统中非常常见的一个模块——BCD码计数器的设计实现与验证,讲解Verilog基础语法,了解BCD码技术器与普通二进制计数器的区别。BCD码计数器经常用在需要十进制计数,十进制格式输出的场合。希望通过这样一个视频教程,带领大家了解除二进制计数器以外的另一种计数实现方式。该BCD码计数器将在综合实验如数字钟、秒表、简易数字频率计中发挥强大作用,简化系统设计。 课程以实现BCD码计数器的设计为起点,手把手演示工程创建,设计输入以及仿真验证,让每一个0基础的朋友都能快速跟上节奏。另外,有一定基础的朋友,其实也可以观看,因为在设计中,我已经将很多的设计小技巧穿插在视频中了。 06 、例解阻塞赋值与非阻塞赋值 本集是视频教程第六讲,主要通过简单的例子对比了Verilog语法中阻塞赋值和非阻塞赋值的区别,通过证明非阻塞赋值多种赋值顺序生产电路的唯一性,与非阻塞赋值多种赋值书序生成电路的不确定性,来展示使用非阻塞赋对设计可预测性的重要意义。 07 、例说状态机 本集是视频教程第七讲,主要通过简单的例子介绍了FPGA设计中最常见的设计思想——状态机,通过状态机,可以实现很复杂的时序控制内容,学好状态机,是掌握FPGA技术的重中之重。 08 、基于状态机的独立按键消抖 本集是视频教程第八讲,主要通过独立按键消抖这样一个实验,来进一步举例讲解状态机的设计思想,独立按键消抖有多种方式可以实现,这里采用状态机的方式,既能方便大家理解按键消抖的整个过程,又能进一步领会状态机的设计思想。 09 、独立按键控制 LED 与亚稳态问题引入 本集是视频教程第九讲,主要通过独立按键控制LED灯状态变化这样一个实验,来验证独立按键消抖是否成功,另外,由于独立按键作为一个外部异步输入信号,因此借此机会刚好给大家详细介绍了亚稳态的原理和应对策略。希望大家在观看学习时,重点体会亚稳态的物理原理并掌握这种简单外部输入信号的亚稳态应对方法。 10 、数码管动态扫描设计与实现 本集是视频教程第十讲,主要通过讲解数码管动态扫描原理,并提取出实现的电路结构,从电路结构入手编写代码,仿真对设计进行验证,最终板级调试时,使用In system sources and probes editor调试工具设置需要显示的内容,则数码管显示对应的数值。本节课与前面课程的风格稍有不同,本节课代码不再是核心,核心是电路结构,电路结构确定后编写代码只是照图施工的过程。这也是越来越接近FPGA设计的底层思维。希望大家仔细体会。 11 、 UART 串口发送模块设计与验证 本集是视频教程第十一讲,主要讲解UART串口发送模块的设计与实现,教程同数码管驱动的讲解方法一致,也是从结构到电路,最后写代码照图施工,仿真对设计进行验证,最终板级调试时,使用In system sources and probes editor调试工具设置需要发送的内容,按下按键,则串口发送模块将需要发送的数据对应发送出去,在PC机上使用串口调试工具即可接收显示,验证设计的正确性。该模块将作为后期很多设计的基础模块进行使用,希望大家都能够自己编写并调试通过,为后面的学习做好准备。 12 、 UART 串口接收模块设计与验证 本集是视频教程第十二讲,主要讲解UART串口接收模块的设计与实现,教程同数码管驱动的讲解方法一致,也是从结构到电路,最后写代码照图施工,仿真对设计进行验证,最终板级调试时,在PC机上使用串口调试工具发送测试数据,使用In system sources and probes editor调试工具查看串口接收模块接收到的数据内容。通过比对发送和接收到的数据是否一致,验证设计的正确性。该模块将作为后期很多设计的基础模块进行使用,希望大家都能够自己编写并调试通过,为后面的学习做好准备。 13 、嵌入式块 RAM 应用之双口 RAM 本集是视频教程第十三讲,主要讲解FPGA芯片中提供的专用嵌入式块RAM的应用实例之一,也就是RAM IP核的使用。课程首先简单介绍了Altera Cyclone 系列FPGA器件的内部结构,然后介绍了RAM IP核的调用方法和配置窗口中的一些参数含义,然后通过仿真的方式对RAM IP核的接口时序进行了分析,为下一节课,RAM IP的具体应用实例打下了基础。希望大家仔细体会这种使用仿真来探索验证IP核接口时序的方法。 14 、搭建串口收发与存取双口 RAM 简易应用系统 本集是视频教程第十四讲,主要通过将前面三讲(串口发送、串口接收、嵌入式块RAM)综合起来,设计了一个简易的小系统,通过电脑以串口发送数据给FPGA,FPGA接收后存储在RAM中,再在按键的控制下,读取RAM中的数据,通过串口发送出去。来体现模块化设计的巨大优势。同时,视频花了相当的时间来演示使用Visio绘制系统架构图,一个好的架构图,不仅能够让设计者思维更清晰,也更加有利于设计在工程师间的交互,方便后期的升级和维护。希望大家仔细体会我这种模块化拼接的设计思想。 15 、 ROM 的搭建与 Signaltap II 工具使用 本集是视频教程第十五讲,主要介绍了嵌入式块RAM的另一个具体应用——ROM。在很多电子系统中,总有一部分数据是从始至终不需要改变,只需要在使用的时候读取即可。在FPGA中,我们可以使用嵌入式块RAM搭建具有ROM属性的存储器,用来存放某些需要永久保存的数据。本节课,通过使用ROM存储器存储三角波数据,外建简易地址发生器,搭建了一个简易的信号发生器系统。并使用Quartus II软件提供的强大的调试工具Signaltap II来对ROM的输出信号进行抓取,以模拟波形的显示出来,从而验证设计的正确性,同时,本课程还介绍了使用In-System memory content editor在线更改ROM中的数据,将三角波的波形数据更改为正弦波,然后再次在Signaltap II工具上观察抓取到的信号,以验证数据确实被更改。本节课程,内容并不复杂,但是却使用了多种调试工具,希望大家学有所获。 16 、 FIFO 介绍与时序验证 本集是视频教程第十六讲,主要介绍了嵌入式块RAM的另一个具体应用——FIFO。FIFO的完整英文拼写为First In First Out,即先进先出。FPGA或者ASIC中使用到的FIFO一般指的是对数据的存储具有先进先出特性的一个存储器,常被用于数据的缓存或者高速异步数据的交互。本节课程,理论讲解较为细致,望大家仔细理解体会,祝大家学有所获。 17 、使用 PLL 进行设计 +Verilog 参数化设计介绍 本集是视频教程第十七讲,主要介绍了Altera FPGA器件中提供的专用时钟管理单元PLL的一些基本特性,并通过一个简单的实例:PLL输出的多路频率不同的时钟驱动同一个LED闪烁模块,通过比较LED闪烁的频率来验证PLL对时钟信号的正确管理。另外,视频还介绍了Verilog语法中非常有用的一种技巧——参数化设计。参数化设计能给我们的功能模块带来最大的灵活性,使我们在不修改原本代码内容的前提下,修改其中某些关键参数,从而适应于不同的应用。本节课程,即讲解了PLL 的有关内容,又讲解了参数化设计的语法,希望大家学习过程中仔细体会参数化设计的好处。 18 、基于线性序列机设计思想的串行 DAC ( TLC5620 )驱动 本集是视频教程第十八讲,主要介绍了FPGA设计中除状态机的设计思想外另外一种常见的设计方式——线性序列机。线性序列机和状态机比较相似,确更加容易规划实现,对于信号变化与时间一一对应的时序设计,采用线性序列机往往更加快捷高效。本课首先介绍了线性序列机的设计思想,然后针对芯航线FPGA套件中配套的多通道串行ADDA模块,介绍了其DAC电路和参考源电路,DAC芯片使用TLC5620芯片,该芯片的控制时序就是每个控制信号的变化时间与时间一一对应,因此非常适合使用线性序列机进行设计。接着,在Quartus II软件中设计并使用modelsim仿真验证依据线性序列机的设计思想设计的TLC5620控制器,最后,在芯航线FPGA学习套件上进行板级验证,以验证设计的正确性。验证时,使用In system sources and probes editor工具,输入希望输出的电压值对应的数字值,则芯航线FPGA开发板控制DAC模块输出正确的电压值。本节课程,引入了新的一种设计方式——线性序列机,希望学习者自己体会,感受这种方式在应对具有串行执行特征的时序电路设计中的优势。 19 、基于线性序列机设计思想的串行 ADC 驱动 课程目标:学会使用线性序列机的思想设计常见的有串行执行特征的时序逻辑 实验平台:芯航线FPGA学习套件主板,芯航线串行ADDA模块 实验现象:将串行多通道ADDA模块接在芯航线FPGA开发板上,使用In system sources and probes editor设置DAC模块输出电压信号,然后使用ADC采样DAC的输出电压,将DAC输出值和ADC采样值进行比较,同时使用万用表测量DAC输出电压以验证ADC控制逻辑的正确性。 知识点: 1.复习线性序列机设计思想与实现 2.TLV1544型ADC芯片驱动设计 20 、 HT6221 红外遥控解码 本集是视频教程第二十讲,具体课程内容如下所示: 课程目标:学会使用FPGA来对脉冲编码的数字序列进行解码 实验平台:芯航线FPGA学习套件主板,基于HT6221的红外遥控器 实验现象:按下红外遥控上的按键,然后在Quartus II软件中使用In system sources and probes editor中观察解码结果,根据解码结果与红外遥控实际发出的数值进行比较从而判断解码的正确性。 本节课知识点: 1.脉冲编码的数字解析 2.HT6221型红外遥控编码的解码实现     小梅哥 芯航线电子工作室 2016年1月26日星期二
  • 热度 3
    2016-1-29 23:40
    670 次阅读|
    3 个评论
          今天,有网友在群里提问“我这个简单的闪灯程序(无其它任何多余的逻辑或*.c),运行久了,居然会死机!运行环境:EPCQ+片上RAM+NIOS II的方式。时钟:37.125MHz,通过JTAG电缆Debug NIOS,则不会。这是怎么回事呀 ?”     相信这样一个问题,很多人都遇到过,我之前在做NIOS II应用开发时,也遇到过这个问题,当时怀疑是NIOS II不稳定导致的,因为各大网络论坛和QQ群,吐槽NIOS II处理器鸡肋的实在是太多了。这里,小梅哥不去评判NIOS II处理器究运算竟性能几何,稳定性如何,因为各人有各人的观念和实际大环境,有的公司打死不愿用NIOS II,而有的公司做产品却离不开NIOS II。对于一个Altera推广了十多年的软核处理器,我不相信经过十多年的发展,还存在这么弱智的BUG。     该网友的问题,实际是可以合理解释并且解决的。       因为jtag uart实际是由jtag模拟的,本质上是个fifo,当你在NIOS II中使用printf(alt_putchar、alt_printf、alt_putchar)函数时,实际是将需要发送的数据写入了这个fifo中,这个fifo中的数据由PC机上的NIOS II EDS软件中附带的程序通过JTAG协议去读取并显示在NIOS II Console中。     那么,假如因为某些原因pc上的console断开(用户手动关闭Console通信,或者JTAG线缆被拔掉),则不会再有程序去持续读取这个fifo中的值,因此,一旦NIOS II中仍旧有发送请求,则会继续去写这个FIFO,因为没有PC机去及时读取这个FIFO中的值,所以当FIFO被写满之后,则NIOS II的JTAG UART驱动会判断得到当前发送FIFO已满,不能再写入数据,因此程序会一直停在这个地方等待,直到FIFO中的数据被读走一部分,以有足够的空间写入需要发送的数据。     所以,因为console已经断开了,所以永远不会再去读取FIFO中的值了,因此这个FIFO在被写满之后也将永远处于满状态,不能再写入新的数据,所以NIOS II CPU的程序也会一直卡在发送函数这里,不会继续执行,就发生了程序死机的现象。     另外,大家可能遇到过,带JTAG UART的并经常有数据通过JTAG UART传输的系统,在运行过程中,我们去进行一下其他的操作,然后Eclipse for NIOS II就停止响应了,程序会强制退出,其实也是受这个JTAG UART的影响。我就经常因为不小心就这样把eclipse搞死了,所以我现在比较保守了,一半不使用JTAG UART进行调试,而是直接用RS232 UART来进行调试。 小梅哥 2016年1月29日 芯航线电子工作室
  • 热度 1
    2016-1-29 17:59
    713 次阅读|
    1 个评论
             小梅哥接触过不少的从0开始接触Verilog语法的朋友,他们对于语法的掌握基本趋近于0,对于使用Verilog描述一个逻辑模块的最基本结构都不清楚,因此这里小梅哥特地使用一个例子来介绍一下使用Verilog设计数字逻辑模块的一般结构。          本章主要讲解Verilog基础语法的内容,文章以一个最简单的例子“二选一多路器”来引入一个最简单的Verilog设计文件的基本结构。 以下为本章中例子中的代码: 01  /*======================================= 02  *   file neme : mux2.v 03  *   author :   小梅哥 04  *   Verison    :   V1.0 05  *   date       :   2015年07月01日 06  *   description: 07  *          当sel为0时,将输入端口in_a上的数据通过out端口输出, 08  *      否则将输入端口in_b上的数据通过out端口输出 09  =======================================*/ 10 11  module mux2 ( in_a , in_b , sel , out ); 12 13     input    in_a ;   //输入端口in_a 14     input in_b ; //输入端口in_b 15     16     input    sel ;    //通路选择线 17     18     output out ; //输出端口out 19 20  /*--------------------------------------------   21     当sel为0时,选择将in_a端口的数据通过out端口输出, 22     当sel为1时,选择将in_b端口的数据通过out端口输出. 23  --------------------------------------------*/    24     assign out = ( sel == 1'b0 )? in_a : in_b ; 25 26  endmodule            (注:最左侧一列行号是作者为了讲解方便加上的,不属于代码内容,请知悉) 以上代码描述的电路如下图所示: 图:二选一多路器电路模型   第1到9行:          该部分为文件头,记录了本设计文件中的一些基本信息如设计者、版本号、修改历史以及代码实现的功能描述。在编译时,该部分属于注释内容,将不被综合成任何内容。   第11行: module mux2 ( in_a , in_b , sel , out );          该行第一个字符串“module”为Verilog中的一个保留字(关键词),该保留字的出现表明了一个模块内容的开始。相对应的,第26行的“endmodule”也是一个保留字,该保留字的出现表明了一个模块内容的结束。在Verilog语法中,module和encmodule总是成对出现,module和encmodule之间的内容则是用户代码。          module之后是一个空格(或制表符“tab”),空格或制表符数量不一定限定为1个,也可以是多个,对结果没有任何影响。紧跟空格之后的mux2则是模块名称,该名称由用户自己定义,但一般要求与设计内容有一定关系,通过该名称能够体现出模块的功能或作用,例如这里使用mux2表明这是一个二选一多路器,让人一目了然。换个例子,如果要做PWM波生成模块,则可以直接以PWM作为模块名( module PWM (……); )这样简洁直观,一看就能理解模块的功能。          mux2之后使用圆括号括起来的部分则是端口列表,该列表中列出了该模块所有需要外部输入或者需要输出到外部的信号,信号间以英文中的逗号“,”隔开。端口名的命名也尽量能够代表该端口信号的实际功能或意义,例如“in_a”,很清晰的就能告诉读者这是数据输入通道的a端口。   第13行到18行: 13       input    in_a ;   //输入端口in_a 14       input in_b ; //输入端口in_b 15       16       input    sel ;    //通路选择线 17       18       output out ; //输出端口out          这里蓝色保留字“ input ”和“ output ”是端口类型,input表示该端口是本模块的输入型端口,output表示该端口是本模块的输出型端口。另外,在实际项目中,还有一种很常见的端口类型是双向端口,Verilog中用关键字“ inout ”来表示。在本例中,由于没有使用到双向端口,因此不做介绍,该部分内容将在后面以一个单独的章节来进行讲解。          第13行紧跟着“ input ”之后用方括号括起来的部分 表示端口的宽度,这里表示输入端口in_a的位宽为2。需要注意的是,定义位宽时虽然写成 和 表示的位宽是一致的,但是Verilog中习惯使用 的形式,请大家在自己写代码时也统一遵照这一要求。当位宽为1时,位宽定义部分可以省略,例如第16行的 是可以省略的,即写成 “ input sel ; ” , 与 “ input sel ; ” 效果是一样的。   第20行到23行:          该部分为注释内容,注释主要是为了方便阅读和理解代码,在综合电路时会被忽略。Verilog语法中,注释的格式与C语言中一致,也支持单行注释和块注释。单行注释以“//”开始,有效作用域只在以此符号开始的本行紧随其后的内容,换行后就不起作用了。例如第13行的“//输入端口in_a”就是注释内容,换行后第14行就不再是被注释掉的内容了。第20行到第23行为块注释,块注释以“/*    */”组织,两个“*”之间的内容即为注释内容,此种注释方式支持换行,注释内容以“/*”开始,换行后注释属性依然有效,直到出现“*/”,则注释部分结束。不过需要注意的是,块注释不支持嵌套,当强行使用这种方式时会导致编译错误。例如以下这种格式就是错误的: /*  一级块注释内容 /*  二级块注释内容 */ …… */ 第24行: 24     assign out = ( sel == 1'b0 )? in_a : in_b ;          这一行为赋值语句,这里是Verilog中最基础的一种赋值方式——连续赋值语句。这段代码的意义就是“判断括号中的条件是否成立,若成立,则将in_a的值赋给out,否则,则将in_b的值赋给out”,即通过这种方式实现了根据条件选择通道的功能。其中,“?”之后“:”之前的信号为括号中条件满足时需要赋给out的的源信号,“:”之后的信号则是括号中条件不满足时需要赋给out的源信号。此种赋值方式还支持多重选择,例如下面的代码: assign out = ( sel1 == 1'b0 )? in_a : ( sel2 == 1 )? in_b : in_c ;            这里有三个数据输入端口“in_a , in_b , in_c”,两个选择输入端口“sel1 , sel2”。该句话的意思就是,当第一个括号中的条件满足时,则将in_a的数据赋值给out,否则再判断第二个括号中的条件是否满足,满足则将in_b的值赋给out,不满足则将in_c的值赋给out。括号中的内容可以直接简写为(!sel1)或者(!sel2),这一点与C语言一样。            通过这一章,我们学习了采用Verilog HDL设计简单的模块的基本代码结构,包括声明模块的”module   endmodule”、端口的定义、端口类型以及位宽的声明、注释内容的格式以及连续赋值语句的写法,而且通过此例子完成了一个简单的二选一多路器的设计。希望对于Verilog HDL语法零基础的读者在看罢此文后能够关闭此文档,在Quartus II或Modelsim、ISE等工具中实际动手敲一遍。可结合前面介绍Altera 公司FPGA器件开发流程一章中的步骤,实际建立工程并输入代码,然后分析和综合,通过综合工具,查看自己编写的代码是否有错误,如有错误,则根据软件提示加以改正。          下一章,将以此模块的测试文件(testbench)为例,介绍Testbench的基本语法。     如有更多问题,欢迎留言,也可加入技术支持群一起交流学习。群号:472607506   小梅哥 芯航线电子工作室    
  • 热度 1
    2016-1-27 17:37
    1142 次阅读|
    1 个评论
        很多做过单片机的朋友都知道,我们在对MCU烧写完程序固件后,那么该程序固件就存储在了该MCU内部。即使MCU断电了再重新上电,程序也能继续运行。这是因为对MCU烧写固件的实质就是将程序固件写入到MCU的片上程序存储器ROM中,而现代的大部分MCU这个ROM都是FLASH存储器。FLASH存储器能够掉电保持数据,所以可以实现掉电程序不丢失。Altera或Xilinx的FPGA芯片,使用的是基于SRAM结构的查找表,而SRAM的一大特性就是掉电数据会丢失,当我们使用JTAG将SRAM配置文件(.sof)配置到FPGA芯片中后,这些数据是直接存储在SRAM结构的查找表中的,因此,一旦芯片掉电,则SRAM中的数据将丢失,再次上电后,SRAM中将不再有有效的数据。这也就是我们常见的,使用JTAG下载SOF固件到FPGA中后,板子重新上电,则之前下载的固件又不在了的原因。当我们的系统做稳定后并量产时,当然希望能够永久保持电路固件,即让FPGA上电后其查找表中就被写入有效的数据。但是我们又不能总是每次系统上电了就用JTAG去下载一次程序固件。因此,FPGA支持另外一种配置方式:主动串行配置。      所谓主动串行配置,就是在FPGA芯片外部放置一片能够掉电数据不丢失的存储器,例如最常见的EPCS、QFLASH、并口FLASH,来存储设计好的电路固件。而FPGA芯片内部,则设计了一个专用的硬件电路,在芯片刚上电的时刻就主动去读取存储在该存储器中的固件,并配置到FPGA芯片的每一个SRAM中去。通过这样一种方式,即可在不改变FPGA芯片SRAM工艺的查找表结构前提下,让每次芯片上电后,都能获得有效的配置数据。外部存储电路配置信息的芯片,我们称之为配置芯片。前些年,Altera的FPGA芯片指明只能使用其公司自己发售的EPCS芯片作为外部配置器件,该EPCS芯片实质就是一个SPI接口的串行FLASH芯片,不过是经过了Altera的严格测试,性能优异。而近些年,随着芯片生产工艺的不断发展,很多其他厂家生产的SPI接口的FLASH芯片也能够达到EPCS的技术标准,因此Altera就放开了该限制,并指出可以使用其他芯片厂家生产的SPI接口的FLASH芯片代替EPCS。我们芯航线starter board上就使用了一片ST公司生产的16Mbit的串行FLASH芯片M25P16来作为配置芯片。该芯片性能优异,完全能够达到EPCS的性能标准,而成本则只有相同容量的EPCS芯片的一半不到。      当我们需要将设计好的配置固件固化到该器件中时,有两种方式,第一种方式,也就是传统的方式是使用专用AS接口(与JTAG 10针接口独立)来直接烧写该配置芯片,该种方式需要在电路板上设置一个独立的AS接口,占用PCB板面积。第二种方式,也是现在流行的方式则是通过JTAG接口,经由FPGA芯片间接烧写该配置芯片。我们的开发板没有做独立的AS接口,因此只支持第二种烧写方式。以下对该种烧写方式以一个实际例子来进行讲解说明。   打开希望固化的FPGA设计工程,这里我直接打开按键消抖这节课的工程。   在quartus ii软件中点击File—Convert Programming Files,如下图所示:(温馨提示:点击图片可查看高清大图)   在弹出的窗口中,Programming file type 选择JTAG Indirect Configuration File(.jic),Mode选择Active Serial,Configuration device选择EPCS16,File name默认是output_file.jic,这里,我们养成良好的习惯,将其改成工程名字:key_filter.jic。 (温馨提示:点击图片可查看高清大图)   四、在input files to convert一栏中,点击Flash Loader一项,在右侧点击Add Device选项,如下图所示: (温馨提示:点击图片可查看高清大图)   五、点击Add Device选项后在弹出的选项卡中,选择EP4CE10,然后点击OK,如下图所示: (温馨提示:点击图片可查看高清大图)   六、点击OK后会回到先前的配置页面,此时再次鼠标点击SOF Data,再点击右侧的Add File,如下图所示: (温馨提示:点击图片可查看高清大图)   七、在弹出的窗口中,在output files文件夹下找到“key_filter.sof”文件,点击open,即可添加进来,如下图所示: (温馨提示:点击图片可查看高清大图)   八、点击open后,回到配置页面,点击Generate按钮,如下图所示: (温馨提示:点击图片可查看高清大图)   九、点击Generate按钮后,则软件开始转换文件,转换成功后弹出成功提示窗口,如下图所示: (温馨提示:点击图片可查看高清大图)   十、点击OK即可,然后close窗口。 十一、打开Quartus II中的下载工具programmer,将原有的sof文件移出,重新添加key_filter.jic文件进来,勾选programming/configuration,如下图所示: (温馨提示:点击图片可查看高清大图)   十二、设置完成后,点击Start(前提是下载器与开发板已经正确连接),则软件开始烧录固件,整个烧录时间大约花费20秒钟左右。烧录完成后,此时固件已经保存在了配置芯片中,但是此刻FPGA还不能运行该固件,因为当前的固件是存在配置芯片中的,并没有被配置到FPGA中,因此需要让FPGA执行一次从配置芯片中主动配置固件的过程,方法很简单,给开发板断电后重新上电即可。此时,我们按下按键0或者按键1,就可以看到LED的状态发生变化了。断电再上电,固件依旧保持,整个设计固化工作完成。   如有更多问题,欢迎加入芯航线 FPGA 技术支持群:472607506 各位朋友,接下来的一年到半年里,小梅哥将持续发布各种原创资料,各位如果对我们的内容感兴趣的,可以选择关注我的博客,这样每次我有新的动态,大家就能收到邮件了。 小梅哥 芯航线电子工作室
  • 热度 5
    2014-11-18 10:10
    592 次阅读|
    4 个评论
            各位,由于小梅哥最近工作了,公司安排给了很多任务,可能更新的计划暂时要搁浅一到两个月。当然大家也不要觉得可惜,因为当小梅哥阶段性工作完成后,工作中的成果都会发布到博客里面来,那时候,相信进过了公司资深工程师的严格检验,小梅哥写的东西一定能够比现在成熟和优秀
广告