打印

我与赛灵思的2012+可编程逻辑器件(PLD)认识与使用初步

[复制链接]
1844|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
568581185|  楼主 | 2012-12-28 14:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 568581185 于 2012-12-28 15:34 编辑

使用计算机的电子设计自动化(EDA,Electronic Design Automatic)是当前电子设计及测试领域最流行的技术。随着EDA技术和半导体微细加工技术的不断进步,数字逻辑的实现逐步由采用中小规模标准通用集成电路,向采用面向用户专用集成电路(ASIC::Application Specific Integrated Circuit)的过渡。可编程逻辑器件(PLD:Programmable Logic Device)是ASIC的一个重要分支,采用PLD设计数字系统,一方面提高了系统集成度以及系统可靠性与稳定性,另一方面简化了设计工作,加快了设计速度,降低了系统造价。
EDA使用的是从概念出发,集成行为级、逻辑级和电路级得分层式自顶而下(Top-Down)的设计思想。

1.        WebPACK软件的使用
   WebPACK是一个功能强大的CPLD/FPGA开发软件,为了使实验者更快、更好的掌握CPLD/FPGA的开发过程和方法,在进行相关实验前有必要了解一些WebPACK软件的操作、使用方法。
在WebPACK下的任何开发主要包括:设计输入、进程的运行、管脚锁定和器件下载编程四个过程,其中设计输入是指设计者对器件的逻辑功能进行描述,设计输入有多种表达方式,硬件描述HDL语言和原理图输入是最常见的两种。硬件描述语言使用文本形式的描述设计,其中较高级的行为描述语言如VHDL和VerilogHDL是目前较流行的两种硬件设计语言;原理图是图形化的表达方式,使用组件符号和联机符号来描述设计。
由于VerilogHDL语言在编程风格具有灵活、简单、易学易用的特点,同时由于它充分保留了C语言简洁、高效的编程风格,如果用户有一定的C语言编程经验,就可以在较短的时间内掌握Verilog HDL语言,本论文将以它为例来讲述WebPACK软件的使用方法。
    (1)双击桌面的ProjectNavigator快捷图标即可进入如图1所示的WebPACK软件的集成开发环境,或许和您的不一样,这是因为WebPACK软件会自动打开上次正确处理的工程文件。由图可以看出,它主要包括以下几大部分:   
● 项目标题栏:显示当前正在操作的项目的项目名及其所在的路径。
● 菜单栏:命令操作菜单,为用户提供了一个良好的命令菜单,所有的命令都包括在这些菜单中。
● 工具栏:常用命令组成的快捷工具栏,为用户提供了一种更快捷的命令操作方法。
● 工程项目窗口:显示本工程文件的结构,即显示所有与项目相关的设计文件,使用户能够简单方便的对各文件进行操作。项目来源包括需要描述设计行为的所有文件:原理图或HDL源文件、测试文件和设计文件三大类。
● 进程窗口:显示在工程窗口中所选源程序的请求全过程。过程包括综合、测试工作台发生、仿真、实现、器件编程、报告生成或其它逻辑设计步骤。
● 编辑窗口:源程序文件的编辑、修改。
                                                                                                                                                                

                                                                                                  1     WebPACK集成开发环境
● 信息输出窗口:显示处理过程运行结果的全部信息、错误提示信息、警告提示信息等。
(2)WebPACK软件是以工程来管理项目及其项目文件的,因此在WebPACK下的任何设计必须是从工程文件开始。单击菜单栏的File选项,在弹出的下拉菜单中选择New Project命令,出现如图2所示的新建工程文件对话框。在Project Name栏内输入该工程的文件名,如 Project1,对已存在的工程文件,可点击 Project旁的浏览器按钮选择所需工程。建立的工程文件需要存放在安装目录 Xilinx\bin\文件夹下,否则不生成 error.log文件,无法查错。
                                                                                 
                                                                                           图2  新建项目对话框1
(3)然后点击“下一步“,得到如图3所示的新建项目对话框2,在Value菜单下设置工程文件的基本属性,其中包括,器件的类型、器件的具体型号和所用的编程语言。当然器件的类型和具体型号必须按照您所用的目标器件来选择,本实验装置使用的是Xilinx公司的XC9500系列芯片XC95108(PLCC84型封装)。这时点击Value菜单中的相应选项,在弹出的下拉菜单中选择相应的器件及其型号。
(4)点击编程语言选择栏,这时会弹出相应的下拉菜单。由图可以看出WebPACK软件支持多种编程语言,如VHDL语言、Verilog HDL语言等,这时选择Verilog选项。基本的属性设置已完成,如图3所示。点击“下一步”命令,直到完成(得到如图4的一些图,其间的一些设置在后面述说)。
                                                                                 
                                                                                                               图3  新建项目对话框2
                                                                                                                              图4
(5)这时又返回到WebPACK集成开发环境,所不同的是在工程项目窗口已经多出了基本工程框架如图5所示。Projectl是工程项目名,XC95108是所选用的器件,-10是器件的速度表示器件的门延时file:///C:/Users/qinqin/AppData/Local/Temp/msohtml1/03/clip_image010.gif为10ns。

                                                                                                
                                                                                                              图5 工程项目窗口
(6)点击菜单栏内的Project选项,在弹出的菜单中选择New Source命令建立源程序文件,此时弹出如图6所示的新建源程序文件对话框。对话框的左边栏内为用户提供了可以选择源程序的输入方法,其中Verilog Module选项为您提供了一个Verilog HDL语言设计方法,Schematic选项则为您提供了一个原理图的输入设计方法。选择Verilog Module选项采用硬件描述语言Verilog HDL输入方式,然后在File栏内键入该文件的文件名,如JK。对于路径的设置项Location用户可以取其默认值,这样保证了工程项目和源程序文件是在同一个目录中。并选中右下角Add to project框。

                                                                                                           6 新建源程序文件对话框
(7)单击“下一步”命令按钮,弹出如图7所示的输入输出引脚定义窗口。定义您所需要的输入输出管脚,下面以JK触发器(在后面编的程序中会用到)为例讲述如何进行Verilog HDL语言的设计。首先在Port Name栏内键入4个输入管脚名Clk,J,K,Clr,设置它们的属性为Input,Msb和Lsb栏内均不输入(默认为1个输入口);继续输入Q,NQ管脚名,并设置它的属性为Output,同样它的宽度也是1位。输入完毕点击“下一步”命令按钮,在接下来的确认对话框中单击“完成”命令按钮。出现窗口如图8。
(8) 接下来点击菜单栏内的Project选项,在弹出的菜单中选择New Source命令建立源程序文件,此时弹出如图9所示的新建执行文件对话框。选中左边栏内的Implementation Constraints File,然后在File栏内键入该文件的文件名JK产生ucf文件(此文件在后面程序与硬件联系的过程中必不可少)。然后点击“下一步”,在出现的对话框中依然点击“下一步”,在最后的对话框中点击“完成”按钮即可返回到WebPACK集成开发环境,这时在工程项目栏内多出了JK.ucf执行文件,同时在图8的编辑窗口已经出现了如图10所示的JK.v的基本结构框架。input和output的管脚也可分别写在一行。
7 输入输出引脚定义窗口

                                                                                                                         图8 编程窗口

9 新建执行文件对话框
10 编程窗口
(9)在如图10所示的编程窗口中输入如下代码,完成整个Verilog HDL程序没汁,最后点击工具栏内的“保存”快捷图标保存整个工程项目。

Thumbs.db

113 KB

相关帖子

沙发
568581185|  楼主 | 2012-12-28 14:39 | 只看该作者
本帖最后由 568581185 于 2012-12-28 19:21 编辑
reg Q;                                    //寄存器输出,保存最新的过程性赋值
assign NQ=!Q;                                 //定义NQ为Q反
always@(negedge Clk or negedge Clr)       /*每次Clk或Clr下降沿来到,下面步骤顺                                      序发生,并且实现的是异步清零*/
begin
  if(Clr==0)
    Q=0;                                         //若有Clr负脉冲,则清零
    else                                            //否则实现JK触发器的基本方程
      case ({J,K})
        0:Q=Q;
        1:Q=0;
        2:Q=1;
        3:Q=NQ;        
       endcase
end

注意,在图10中,输入的程序代码应该在module JK(Clk,J,K,Clr,Q,NQ);语句和endmodule语句之间。黑体字代表关键字(在编程窗口显示为蓝色);JK触发器的基本方程为 ,程序中实现的即为此方程。
(10)到此时程序已经完成,但它和实际的硬件还无任何联系,用户必须通过管脚锁定来确立它们之间的关系。在进程窗口中单击Design Entry Utilities左边的符号“+”,展开后单击User Constraints左边的符号“+”再次展开,在出现的项目中选择Assign Package Pins命令并双击它,在程序无错误的情况下(若少了第(8)步即忘了新建ucf文件,下面的过程都不能实现),会弹出如图11所示的管脚锁定界面(在这里用过ISE 5.2i版的人都会明显体会到6.1版本的先进之处!),然后按照实际的硬件要求分别锁定输入输出管脚。锁定方法是:在界面的Design Object List窗口中,在每个管脚对应的Loc一栏中分别填上所定义的引脚数,形式是大写P字母加引脚数,如图所示。若你不小心定义了已经使用过的管脚,聪明的ISE 6.1则不会显示,让你及时发现自己的错误。软件会自动与Function Block和Macrocell联系起来,并且在右边Package Pins for xc95108-PC84-10窗口中对应的管脚上作上标志(暗绿色),非常直观(而且也可以直接移动那些标志来改变引脚的锁定)。其中Package Pin Legend窗口让你更加清楚XC95108的一些特定管脚的定义。顺便也介绍一下ISE 5.2i版本的管脚锁定:首先在Signals栏内点击若所定的管脚如Clk,这时该信号Clk变成深蓝色,移动光标到芯片的相应管脚上并点击该管脚(可以点击工具栏中的放大符号放大管脚图),这时该管脚变成绿色即表示Clk已经被锁成功,当然在Input栏内的Clk会被减去,然后依此方法锁定其它管脚——可以看出这样管脚锁定的方式比较麻烦。本例的管脚锁定信息如表1所示,锁定完毕后保存退出即可重新返回到WebPACK集成开发环境。(在此过程中,进行了综合,若综合synthesize失败,在信息输出窗口可以看到显示,并且在进程窗口中可以看到相应的打×标记。)

                         图11 管脚锁定界面
表1 管脚锁定信息
Pin        Node Name            Pin            Node Name
25             NQ                    63               Clr26              Q                     65                J
62             Clk                    66                K
(11)然后在进程窗口中双击设计实现Implanment Design中的命令,运行相关进程。其中打对勾标记的表示该进程已经成功运行;而打感叹号标记的则表示该进程已经运行,但是包含有系统给出的警告,有关警告的更多详细的信息可以在Transcipt窗口中获取。
(12)将JTAG下载电缆的两端分别接到PC机和实验仪的JTAG口上,打开工作电源。然后在WebPACK集成开发环境的进程窗口中双击Configure Device(iMPACK)命令,会弹出如图12所示的一系列窗口,依照默认设置点击“下一步”按钮直到“完成”。生成程序文件(JK.jed)并选择,稍后会弹出如图13所示下载程序接口,用鼠标左键点击芯片XC95108,此时芯片成深蓝色的突出标记,然后点击鼠标右键在出现的下载快捷菜单中选择GetDeviceID命令检查硬件和JTAG电缆是否连接正确,若检测成功则在信息提示窗口(图13的下半部分)将出现该器件的ID号及其相关信息。使用iMPACT下载配置文件时,启动iMPACT之前,必须关掉先前开的iMPACT。否则,无法进行。

图12 默认设置

图13 下载程序窗口
(13)此时您就可以执行在上一步中出现的快捷菜单中的Program下载命令了,在出现如图14所示的下载选项窗口中根据需要选择相应的选项。其中Erase Before Programming选项表示在下载编程前先擦除芯片,Verify选项表示下载编程完毕后进行下载校验,Read Project选项表示读加密保护位,而Write Project选项表示对芯片加密保护。选中第一项和第二项,点击OK命令按钮开始下载。注意,任何已被加密写过的芯片必须先擦除后再下载。
(14)稍后出现如图15所示的下载进度指示窗口,下载完毕弹出Programme Success!表示下载成功,至此您已经完成一个简单的CPLD开发。你可以在最后设计完成的实验装置上结合按键和发光二极管验证你所编的JK触发器的程序正确性:初始状态:D8亮D7灭(Q=0,NQ=1);按一下S8,即来一个Clk负脉冲,状态改变,D8灭,D7亮(此时实现的是T触发器,因为J=K=1);再按一下S7,即来一个Clr负脉冲,Q清零:D8亮D7灭,由此实现了JK触发器的功能。

图14 下载选项窗口

图15 下载进度指示窗口

2.        Verilog HDL简介
Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。
  Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。
  Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。
    Verilog HDL语言最初是1983年由Gateway Design Automation公司为其模拟器产品开发的硬件建模语言。那时它只是一种专用语言。由于他们的模拟、仿真器产品的广泛使用,Verilog HDL 作为一种便于使用的实用语言逐渐为众多设计者所接受。在一次努力增加语言普及性的活动中,Verilog HDL语言于1990年被推向公众领域。Open Verilog International(OVI)是促进Verilog发展的国际性组织。1992年, OVI决定致力于推广Verilog OVI标准成为IEEE标准。这一努力最后获得成功,Verilog 语言于1995年成为IEEE标准,称为IEEE Std 1364-1995。完整的标准在Verilog硬件描述语言参考手册中有详细描述。
  下面列出的是Verilog硬件描述语言的主要能力:
   * 基本逻辑门,例如and、or和nand等都内置在语言中。
   * 用户定义原语(UDP)创建的灵活性。用户定义的原语既可以是组合逻辑原语,也可以是时序逻辑原语。
   * 开关级基本结构模型,例如pmos 和nmos等也被内置在语言中。
   * 提供显式语言结构,指定设计中的端口到端口的时延及路径时延和设计的时序检查。
   * 可采用三种不同方式或混合方式对设计建模。这些方式包括:行为描述方式—使用过程化结构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述建模。
   * Verilog HDL中有两类数据类型:线网数据类型和寄存器数据类型。线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件。
   * 能够描述层次设计,可使用模块实例结构描述任何层次。
   * 设计的规模可以是任意的;语言不对设计的规模(大小)施加任何限制。
   * Verilog HDL不再是某些公司的专有语言,而是IEEE标准。
   * 人和机器都可阅读Verilog 语言,因此它可作为EDA的工具和设计者之间的交互语言。
   * Verilog HDL语言的描述能力能够通过使用编程语言接口(PLI)机制进一步扩展。PLI是允许外部函数访问Verilog 模块内信息、允许设计者与模拟器交互的例程集合。
   * 设计能够在多个层次上加以描述,从开关级、门级、寄存器传送级(RTL)到算法级,包括进程和队列级。
   * 能够使用内置开关级原语在开关级对设计完整建模。
   * 同一语言可用于生成模拟激励和指定测试的验证约束条件,例如输入值的指定。
   * Verilog HDL 能够监控模拟验证的执行,即模拟验证执行过程中设计的值能够被监控和显示。这些值也能够用于与期望值比较,在不匹配的情况下,打印报告消息。
   * 在行为级描述中,Verilog HDL不仅能够在RTL级上进行设计描述,而且能够在体系结构级描述及其算法级行为上进行设计描述。
   * 能够使用门和模块实例化语句在结构级进行结构描述。
   * Verilog HDL 的混合方式建模能力,即在一个设计中每个模块均可以在不同设计层次上建模。
   * Verilog HDL 还具有内置逻辑函数,例如&(按位与)和|(按位或)。
   * 对高级编程语言结构,例如条件语句、情况语句和循环语句,语言中都可以使用。
   * 可以显式地对并发和定时进行建模。
   * 提供强有力的文件读写能力。
   * 语言在特定情况下是非确定性的,即在不同的模拟器上模型可以产生不同的结果;例如,事件队列上的事件顺序在标准中没有定义。

3.        CPLD开发
介绍由CPLD完成电路的方法和过程。
1)        用Verilog HDL语言设计抢答器
要求:在001181092-Xilinx实验仪上完成抢答器的功能
程序设计:文件名exe1.v。
module exe1(Set,inA,inB,inC,Q1,Q2,Q3);  //模块名(输入管脚与输出管脚)
input Set,inA,I
nB,inC;
    output Q1,Q2,Q3;                 //开始定义输入输出管脚
wire inAA,inBB,inCC;                 //定义连线类型
reg Q1,Q2,Q3;                       //寄存器输出
assign inAA = !inA;                   /*将输入取反,使得上升沿有效。*/
assign inBB = !inB;
assign inCC = !inC;
always@(posedge inAA or negedge Set)  //每次输入或者清零端下降沿到来时,下面步骤顺序发生。
begin
if(Set==0)                                   
Q1 = 1;                             //Set下降沿置1,二极管不能发光,达到清零效果。
else if((Q2==1)&&(Q3==1))                    
Q1 = 0;                  //Set不起作用,并且其它两个二极管不发光时,本二极管发光。
end
always@(posedge inBB or negedge Set)
begin
  if(Set==0)
  Q2 = 1;
  else if((Q1==1)&&(Q3==1))
  Q2 = 0;
end
always@(posedge inCC or negedge Set)
begin
  if(Set==0)
  Q3 = 1;
  else if((Q1==1)&&(Q2==1))
  Q3 = 0;
end
endmodule

使用WebPACK软件
● 双击WebPACK软件快捷图标进入ISE集成开发环境,新建工程项目文件exe1.npl并在该项目下新建Verilog源程序文件exe1.v,输入上面的源程序代码并保存在整个项目文件。实验例程存放在D:\Xilinx\bin\exe1子目录下。
● 然后对工程项目中使用的引脚进行合理的分配和锁定,双击进程窗口中的Assign Pins(ChipViewer)命令进入管脚锁定窗口,按表2所示的对应关系对各管脚进行正确配置并保存此配置。
  表2 管脚锁定方法
Pin        Node Name        Pin        Node Name
24           Q1               66(61)           Set
25           Q2               65(58)           inA
26           Q3               63(57)           inB
                                  62(56)           inC
● 对该工程文件进行编译处理,若在编译过程中发现错误,找出并更正错误直至编译成功为止。
● 将下载电缆的两端分别接到PC机和001181092实验装置的JTAG下载口上,打开工作电源,执行下载命令把程序下载到001181092实验装置的XC95108器件中。
● 观察发光管的两灭状态,上电初时D6、D7、D8都亮;按下S5(Set),清零全灭;按下S6(inA),D6亮;按下S7(inB),D7亮;按下S8(inC),D8亮。在有灯亮时,抢答无效。
由前面的程序可以看出:
(1)        Verilog-HDL程序是由模块构成的,每个模块的内容都是嵌在module和endmodule两个语句之间,每个模块实现特定的功能,模块是可以进行层次嵌套的。
(2)        每个模块要进行端口定义,并说明输入口、输出口(input,output),然后对模块的功能进行逻辑描述。
(3)        Verilog-HDL程序的书写格式自由,一行可以写几个语句,一个语句可以分多行写。
(4)        除了endmodule语句外,每个语句和数据定义的最后必须有分号。
(5)        可以用/*……*/或//……对Verilog—HDL程序的任何部分作注释,一个好的有使用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。
(6)        Verilog-HDL对大小写敏感,空格很重要,是用来界定各个标志的,关键字都是以小写形式表示。   
(7)        过程赋值语句(always)只能对寄存器型的信号,如程序中的Q1、Q2、Q3均为reg型;而连续赋值(assign)语句中,信号不能为寄存器型。
   从上所述可知,Verilog程序的基本结构是由一套模块构成的。每个模块都是由两部分组成,一部分描述接口,另一部分描述逻辑功能。模块既可用“行为描述”,也可用“结构描述”,或者两者都有。一个模块的结构如下:
  module<模块名>(<端口列表>)   
  <端口属性定义,如input,output等>
  <模块所用到的数据类型>
  <逻辑功能定义>这一部分是模块设计中的最重要的部分,它可用三种方法定义:   
  (1)用关键字assign定义语句:
    如assign{cout,sum}=ina+inb+cin;
    这种方法的语句很简单,只需写一个关键字assign,后面加上一个方程即可。再比如要描述一个由二输入a、b的与门,输出为L,则可写为:assign L=a&b;采用“assign”语句是描述组合逻辑最常用的方法之一。
  (2)用实例元件
    如and and_inst(q,a,b);
    采用实例元件的方法相当于在画电路图时从库元件中调用某一已知元件一样,这里只需要键入元件的名字和相连的引脚即可。要求每个实例元件的名字必须是唯一的。
  (3)用always块
如:always@(posedge clk or clr)
    begin
      if(clr) q<=0;
        else if(en) q<=d;
    end
“always”块既可用于描述组合逻辑,也可描述时序逻辑。上面的例子用“always”块生成了一个带有异步清除端的D触发器。“always”块可用于很多种描述手段来表达逻辑,例如,上例中就用了if…else语句来表达逻辑关系。按一定的风格来编写“always”块,可以通过综合工具把源代码自动综合成用门级结构表示的组合或时序逻辑电路。
用Verilog模块实现一定功能,应该清楚哪些是同时发生的,哪些是顺序发生的。上面三种方法描述的逻辑功能是同时执行的。即把这3项写到一个Verilog模块文件中去,它们的次序不会影响逻辑实现的功能,是同时进行的,即并发的。然而,在“always”模块内,逻辑是按照指定的顺序执行的。“always”块中的语句称为“顺序语句”,因为它们是顺序执行的。而“always”模块之间是同时执行的。由上述抢答器例子就会明白,一个“always”内的if…else if…必须顺序执行,否则其功能没有任何意义;三个“always”块之间没有先后顺序。为了能实现我们所要求的功能,“always”模块内部的语句将按照书写的顺序执行。
可以看出Verilog模块中所有过程块、连续赋值语句、实例引用表示的是一种通过变量名互相连接的关系,出现的先后次序不影响程序功能。
在Verilog HDL设计中容易犯的一个通病是由于不正确使用语言,生成了并不想要的锁存器。举一个简单的错误例子,原因是在“always”块中不正确使用if语句。
[例1 ] 有锁存器
always@(al or d)
  begin
    if(al) q<=d;
  end
[例2]无锁存器
always@(al or d)
  begin
    if(al) q<=d;
    else  q<=0;
end
检查一下前边的“always”块,if语句保证了只有当al=1时,q才取d的值。这段程序没有写出al=0时的结果,那么当al=0时会怎么样呢?在“always”块内,如果在给定的条件下变量没有赋值,这个变量将保持原值,也就是说会生成一个锁存器!如果设计人员希望当al=0时q的值为0,else项就必不可少了。请注意看例2的“always”块,整个Verilog程序模块综合起来后,“always”块对应的部分不会生成锁存器。
[例3] 有锁存器
always @(sel[1:0] or a or b)
  case(sel[1:0])
    2’b00: q<=a;
    2’b11: q<=b;
  endcase
[例4]无锁存器
always @(sel[1:0] or a or b)
  case(sel[1:0])
    2’b00: q<=a;
    2’b11: q<=b;
    default: q<=’b0;
  endcase

使用特权

评论回复
板凳
568581185|  楼主 | 2012-12-28 14:41 | 只看该作者
本帖最后由 568581185 于 2012-12-28 19:17 编辑

Verilog HDL程序另一种偶然生成锁存器是在使用case语句时缺少default项的情况下发生的。Case语句的功能是,在某个信号(本例中的sel)取不同的值时,给另一个信号(本例中的q)赋不同的值。注意看例3。如果sel=00时q取a值,而sel=11时q取b的值。这个例子中表述不清楚的是:如果sel取00和11以外的值时q将被赋予什么值?程序是用Verilog HDL写的,即默认为q保持原值,这就会自动生成锁存器。例4很明确,程序中的case语句有default项,指明了如果sel不取00或11时,编译器或仿真器给q赋值,赋为0,因此不需要锁存器。以上就是怎样避免偶然生成锁存器的错误的。如果用到if语句,最好写上else项。如果用case语句,最好写上default项。遵循上面两条原则,就可以避免发生这种错误,使设计者更加明确设计目标,同时也增强了Verilog程序的可读性。

2)        原理图输入——传统设计的方法
  
图16
一个完整的FPGA/CPLD设计流程包括电路设计与输入、功能仿真、综合、综合后仿真、实现、布线后仿真和下板调试等主要步骤,如图16所示。其中电路设计与输入是根据工程师的设计方法将所设计的功能描述给EDA软件。常用的设计输入方法有硬件描述语言(HDL)和原理图设计输入方法。原理图设计输入法根据设计要求,选用器件、绘制原理图、完成输入过程。此方法在大型设计中,可维护性较差,不利于模块建设与重用,且选用芯片升级换代后,所有的原理图都要作相应的改动;但优点是直观、便于理解、元件库资源丰富,尤其适合小电路的设计。
在Xilinx ISE中,我们使用其中集成的原理图输入工具——ECS(Engineering Capture System);在ECS的图形化用户界面下,用户可以编辑原理图和模块符号。ECS与大多数原理图设计工具的界面相似,会使用PCB原理图设计软件的读者一定能够很快掌握ECS的基本功能。由于器件库元件通用性差导致的原理图设计的可移植性差的缺点,对刚接触FPGA/CPLD设计的初学者,建议学习HDL设计方法(VHDL和Verilog HDL)。ECS在ISE中仅仅是一种辅助设计方法,其最常用的场合是在混合设计中。
使用新建原理图(Schematic)资源的方法启动ECS。ECS用户界面如图17所示。ECS的用户界面主要由菜单栏、通用工具栏、绘图工具栏、属性设置选项卡、器件符号选项卡、绘图工作区和状态提示栏组成,大家在逐步学习的过程中,会慢慢掌握其各部分的功能。
以实现抢答器为例,介绍原理图设计的方法和过程。对于本例,可参考已有的用小规模标准通用集成电路实现的抢答器的电路原理图。若无原理图,则应先设计原理图。整个设计的重点是:新建原理图资源,选择并放置器件符号,连线,添加网线名称,设置I/O管脚。
(1)        新建原理图资源。
打开ISE,新建工程wsy1,如图18所示。由于抢答器模块仅仅采用了一些通用器件模块,在Xilinx所有器件上都可实现,所以器件族和型号可以任意选择,综合方式任选。得到如图19所示的界面,然后新建原理图资源文件“wsy1”,如图20所示。单击下一步按钮,显示新建资源信息,单击完成按钮确认新建资源信息,启动ECS。
(2)        选择(新建)并放置器件符号
选择并放置器件符号是绘制原理图的第一步。单击绘图工具栏中的 按钮,在器件符号分类显示目录列表选择“Logic”逻辑目录,在器件符号详细列表选择“and3”三输入与门。也可以在器件符号分类显示目录选择所有器件(All Symbols),符号名称过滤框输入“and3”直接选择器件。器件选择完成后,在原理图合适位置单击鼠标左键放置三个三输入与门。由于ISE附带的器件库中没有符合我们需要的D触发器,需要新建一个器件。点击菜单栏内的Tools选项,在弹出的菜单中选择Symbol Wizard命令,弹出如图21所示的器件创建向导对话框。单击“下一步”,进行器件命名,如图22示。单击add按钮,定义输入输出管脚(包括管脚名称、位数、方向、位置)。然后点击“下一步”直到完成,得到新建器件fdnsr。回到ECS用户界面,在器件符号分类显示目录看到新添的一项“<D:/xilinx/bin/wsy1>”选中并在器件符号详细列表中选择fdnsr,在原理图合适位置单击鼠标左键放置三个此新建D触发器。由于电路需要,放上电源和地。单击Esc键或者双击鼠标右键结束器件选择与放置,结果如图23所示。此时新建元件部分还没有结束,还缺对它的功能描述。

                               图17  ECS的用户界面

                             图18  新建项目对话框1

图19

图20 新建原理图资源文件


图21

                               图22

图23
(3)        添加连线
单击绘图工具栏中的 按钮,在属性设置选项卡选择智能连线方式,当鼠标指针移动到原理图可画线区域时鼠标符号自动变为“+”形状,点击连线开始点的器件管脚两次(第一次选择器件,第二次开始连线),然后点击终点连线的管脚,智能连线器自动地在起始与终点管脚之间布置一条连线。单击Esc键或者双击鼠标右键结束操作,如图24所示。连接其它网线,如图25所示,并在器件端口拉出一小段线段为以后添加网线名称并为设置I/O管脚做准备。

图24

图25
(4)        添加网线名称。
    添加网线名称的作用有两个:一是增强了原理图的可读性,在综合与实现时也易于发现某条网线的时延与布线情况;另外,ECS如大多数原理图编辑工具一样,默认同名网线就是一条网线。换句话说,如果两条网线名称相同,即使在原理图上没有明确连接,ECS也认为它们是同一条网线,有了连接关系。添加网线名称可以区别网线。
    单击绘图工具栏中的 按钮,在属性设置选项卡选择网线分支命名(Name the Branch),在网线名称栏填入“in1”作为与门的第二个输入管脚名称,当鼠标指针移动到原理图时发现鼠标指针处已有了“in1”网线名称,在与门的第二输入连线左端单击鼠标左键,为该网线添加名称。如果单击网线名称栏旁边的 按钮,网线名称序号自动加1或者减1。按同样的方法为其他网线添加名称,如图26所示,单击Ecs键或者双击鼠标右键结束操作。   


图26
(5)        设置I/O管脚。
为已经添加过名称的网线设置I/O端口管脚比较方便,单击绘图工具栏中的 按钮,在属性设置选项卡选择添加输入管脚(Add an input maker),然后在原理图需要添加I/O管脚的网线端口,按住鼠标左键拖出一个框,放开鼠标左键,自动生成一个与网线同名的输出端口。在设置选项卡选择添加输出管脚(Add an output maker),与添加输入管脚相同,添加输出管脚。单击Ecs键或者双击鼠标右键结束操作,如图27所示。

图27
(6)        完成对新建元件的功能描述。
单击通用工具栏中的 按钮保存设计。回到Project Navigator,界面如图28所示。可以看到工程项目窗口中wsy1.sch目录下有带问号的子程序名“fdnsr”,选中它点击菜单栏内的Project选项,在弹出的菜单中选择New Source命令添加源程序文件。步骤与方法和前面HDL语言设计部分相同。在编辑窗口中,完成对fdnsr的HDL语言描述(在器件符号分类列表中选择Flip_Flop,在下面器件符号详细列表中选择fdnsr,然后点击Symbol Info,可以看到对器件fdnsr的完整介绍,包括HDL语言的描述),然后保存。


                                   图28
对fdnsr的HDL语言描述:
module fdnsr(D,Clk,S,R,Q);
    input D;
    input Clk;
    input S;
    input R;
    output Q;
reg Q;
always @ (posedge Clk or negedge S or negedge R)
begin
  if (!S)
     Q <= 1;
  else if (!R)
     Q <= 0;
  else
     Q <= D;
end
endmodule

至此,抢答器的原理图设计已完全完成,
如图29所示。

图29
对设计的原理图,Project Navigator可以
生成相应的Verilog描述:
// Verilog model created from wsy1.sch - Wed May 12 20:25:12 2004
`timescale 1ns / 1ps
module wsy1(inA, inB, inC, Set, Q1, Q2, Q3);
    input inA;
    input inB;
    input inC;
    input Set;
   output Q1;
   output Q2;
   output Q3;
   
   wire Clk1;
   wire Clk2;
   wire Clk3;
   wire D;
   wire R;
   
   fdnsr FF1 (.Clk(Clk1), .D(D), .R(R), .S(Set), .Q(Q1));
   fdnsr FF2 (.Clk(Clk2), .D(D), .R(R), .S(Set), .Q(Q2));
   fdnsr FF3 (.Clk(Clk3), .D(D), .R(R), .S(Set), .Q(Q3));
   AND3 L1 (.I0(Q2), .I1(inA), .I2(Q3), .O(Clk1));
   AND3 L2 (.I0(Q1), .I1(inB), .I2(Q3), .O(Clk2));
   AND3 L3 (.I0(Q1), .I1(inC), .I2(Q2), .O(Clk3));
   VCC XLXI_16 (.P(R));
   GND XLXI_17 (.G(D));
endmodule

接下来的步骤和Webpack软件应用部分介绍的一样,管脚分配和综合、实现然后下载。

四.        001181092-Xilinx 实验装置
001181092-Xilinx 实验装置的电原理图如图30,其实物如图31。

图30-1  001181092-Xilinx实验装置的电路原理图

图30-2  JTAG下载线的电路原理图

图31  001181092-Xilinx实验装置的实物图

使用特权

评论回复
地板
lzbq| | 2012-12-28 18:04 | 只看该作者
好多啊 楼主很厉害 看看

使用特权

评论回复
5
hawksabre| | 2012-12-28 18:29 | 只看该作者
**没有仔细看   太长了   哦呵呵   不过很感谢楼主的共享资料   呵呵   有空仔细看看  谢谢了

使用特权

评论回复
6
GoldSunMonkey| | 2012-12-28 22:31 | 只看该作者
感谢分享

使用特权

评论回复
7
gaochy1126| | 2012-12-29 00:27 | 只看该作者
好蒙 谢谢分享资料

使用特权

评论回复
8
qin552011373| | 2013-1-6 11:17 | 只看该作者
好东西  感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:个人淘宝小店:http://shop70915068.taobao.com 邮件:785606460@qq.com

20

主题

955

帖子

4

粉丝