嵌入式SoC系统设计课件_第1页
嵌入式SoC系统设计课件_第2页
嵌入式SoC系统设计课件_第3页
嵌入式SoC系统设计课件_第4页
嵌入式SoC系统设计课件_第5页
已阅读5页,还剩386页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

绪论什么是FPGA?

现场可编程门阵列

FieldProgrammableGateArray一种可编程逻辑器件Xilinx创始人RossFreeman在20世纪80年代初发明斯坦福大学NetFPGA可编程逻辑器件可编程逻辑器件ProgrammableLogicDevice,PLD20世纪70年代,专用集成电路(ASIC)发展而来软件编程配置,可擦写发展历程70年代初期,PROM,RPROM,EEPROM70年代中期,PAL,GAL80年代中期,CPLD,FPGA90年代末期,SOPC,SOCCPLD与FPGACPLD(ComplexProgrammableLogicDevice)采连续式布线结构,较适合用来实现各种运算和组合逻辑。FPGA采用分段式布线结构,适用于实现循序逻辑,寄存器资源丰富。FPGA与ASICASIC(专用集成电路)-定制

FPGA(现场可编程门阵列)-半定制采用FPGA,用户不需要投片生产,就能得到合用的芯片FPGA可作为其他全定制或半定制ASIC电路的中试样片FPGA由存放在片内RAM中的程序来设置工作状态,可以反复使用FPGA结构简介逻辑单元阵列可配置逻辑模块CLB(ConfigurableLogicBlock)输出输入模块IOB(InputOutputBlock)内部连线(Interconnect)Virtex-II的架构Virtex™-IIarchitecture’scorevoltage

operatesat1.5VI/OBlocks(IOBs)ConfigurableLogicBlocks(CLBs)ClockManagement(DCMs,BUFGMUXes)BlockSelectRAM™resourceDedicatedmultipliersProgrammableinterconnectIOBIOB分成若干个组(Bank),每个Bank接口电压相同。可配置逻辑块(CLBTile)SLICELUT4或6输入DCM

时钟资源管理器BlockRAM以Virtex-II为例BlockRAM其他资源布线资源移位寄存器分布式RAM嵌入式IP核软核:寄存器传输级(RTL)模型固核:带有平面规划信息的网表硬核:经验证的设计版图FPGA引脚主要厂商Xilinx 军品级、宇航级Altera

ActelLattice市场比较Xilinx$481MinQ206LatticeActelQuickLogicSource:CompanyReports(LSCC,ALTR,ACTL,XLNX,QUIK)RevenuebycalendarquarterXilinxRevenue$1.73Bin2005AlteraXilinx可编程器件市场份额(2007)Source:CompanyreportsLatestinformationavailable;computedona4-quarterrollingbasisAlteraAll

OthersFPGASegmentXilinxrevenuesaregreaterthanallotherpure-playPLDcompaniescombined.XilinxXilinxFPGA发展历史1985年,Xilinx当全球首款FPGA产品XC2064,2μm工艺,包含64个逻辑模块和85000个晶体管,门数量不超过1000个。2007年,65nm工艺的Virtex5产品,门数量已经达到千万级,晶体管个数超过10亿个。2009年,45nm工艺的Virtex6系列,76万个逻辑单元,功耗降低50%。最新面世XilinxVirtex7系列,28nm工艺,200万个逻辑单元,功耗再降低50%。Virtex系列工艺/核心电压时钟特色Virtex-2150nm1.5V420MHz40万-800万门Virtex-2Pro130nm1.5V420MHz2个400MHz的PowerPC3.125GbpsRocketIO™Virtex-490ns1.2V500MHz20万个逻辑单元LX、SX、FXVirtex-565ns1V550MHz33万个逻辑单元LX、LXT、SXTXilinxFPGA家族200220062008201070060020002004CoolRunner-IISpartan-3E100MHz,92DMIPSNextGeneration

SpartanSpartan-3100MHz,92DMIPSVirtex-IIPro150MHz,120DMIPS100200Virtex-4200MHz,160DMIPSVirtex-5MontBlancMHzVirtex-4,450MHz400500300Virtex-IIProVirtex-5MontBlancTrilogySpartan系列工艺/架构时钟特色Spartan-22E180nm/150nm200MHz20万门Spartan-390nmVirtex-II340MHz5万-500万低端代表Spartan-3A90ns500MHz5万-340万DNAID技术Spartan-3E90ns500MHz10万-160万Spartan-3系列Spartan-3ADSPFPGADSP应用Spartan-3ANFPGA

非易失性应用Spartan-3AFPGAI/O优化应用Spartan-3EFPGA

逻辑优化应用Spartan-3FPGA

最高密度和引脚数的应用Xilinx和Altera产品比较Xilinx Spartan3E 50万门

VirtexIIPro:XC2VP30 300万门,2个PowerPC Virtex-4:XC4VSX25FF668 800万门Altera Cyclone:EP1C6Q240

约12万门

CycloneII:EP2C35F672

等效150万门,没有硬核

StratixII开发技术基础电路设计:电路板设计、焊接、调试(电路、模电、数电、集成电路)硬件设计:芯片设计、结构设计、总线接口设计、存储器控制(计算机组成原理、接口技术)系统开发:编程技术、调试技术、嵌入式开发(硬件描述语言基础、嵌入式系统)应用开发:通信网络、图像处理、音视频处理、并行计算(通信原理、Matlab建模等)人才需求硬件工程师缺口巨大,08年统计缺口1.2万。从业要求熟悉电路设计、PCB布板、电路调试,能熟练使用PROTEL等电路设计软件;熟练应用常用电子元器件,熟练检索各种元器件材料;掌握常用的硬件设计工具,调试仪器仪表的使用方法;2年以上硬件产品的开发工作经验,熟悉嵌入式系统的硬件及软件开发;工作态度积极,责任心强,良好的沟通与团队配合;独立设计过完整的电子产品,能读懂英文产品规格书。人才需求硬件工程师必备知识基本设计规范CPU基本知识、架构、性能及选型指导MOTOROLA公司的PowerPC系列基本知识、性能详解及选型指导网络处理器(INTEL、MOTOROLA、IBM)的基本知识、架构、性能及选型常用总线的基本知识、性能详解各种存储器的详细性能介绍、设计要点及选型

人才需求Datacom、Telecom领域常用物理层接口芯片基本知识,性能、设计要点及选型常用器件选型要点与精华FPGA、CPLD、EPLD的详细性能介绍、设计要点及选型指导VHDL和Verilog网络基础国内大型通信设备公司硬件研究开发流程人才需求

熟练掌握并使用业界最新、最流行的专业设计工具Innoveda公司的ViewDraw,PowerPCB,Cam350CADENCE公司的OrCad;Allegro,SpectraAltera公司的MAX+PLUSXILINX公司的FOUNDATION、ISE应用领域CIC设计与验证CPU、嵌入式系统通信领域网络通信设备安全设备数据采集与信息处理生物信息金融领域应用领域应用领域应用领域应用领域应用领域应用领域应用领域应用领域应用领域参考书目参考书目开放资源开放资源Xilinx官方网站SEED-XDTKMboard实验箱主板支持XUPV2Pro或者FEM025并行高速A/D和D/A,8位,1M串行高速A/D和D/A,12位,30MLCD显示模块(122*32)数码管显示模块(8段)LED点阵显示模块(16*16)USB2.0模块RTC+EEPROM模块蜂鸣器键盘模块7寸640x480VGA液晶显示器CCD摄像头核心板用一套硬件实现包括“逻辑与计算机设计基础”、“计算机组成”、“汇编与接口”、“嵌入式系统”等课程IPCore的使用ISE提供的IPCore面向复杂设计的软核ISE版本的适用性XilinxFPGA芯片的适用性系统IPCore的生成在ISE的Project中直接生成ISE->Accessories->CoreGeneratorISE->Accessories->ArchitectureWizardIP参数化设计IPCore的使用方法1:定制ISE中一个已有的IPCore小写IPCore的使用IPCore的使用定制同步FIFO Core为例IPCore使用说明IPCore的使用生成点击GenerateISE的ModuleView窗口中出现所生成的IPCoreIPCore的使用例化生成IPCore后,工程所在文件夹下产生下列文件.xco是IPCore配置文件 例化的时候识别.xco.edn是网表文件.v和.vhd是模块的封装源代码IPCore的使用方法2:CoreGeneratorIPCore的使用IPCore的使用配置生成配置IPCore的使用配置高级配置IPCore的使用方法2:ArchitectureWizardIP复杂的IPCore生成,如DCMIPCore的使用例化产生的关键文件.ucf是约束文件.xaw是二进制的Core文件 (例化时和.xco的使用类似).v是模块的封装源代码.ngc

二进制网表文件(根据综合选项不同而生成)IPCore的使用IPCore端口声明ViewHDLFunctionalModelIPCore的使用IPCore的说明IPCore生成后,添加到工程中被认为是黑盒子,不会被重新综合;IPCore的可移植性与ISE的版本和芯片类型有关;部分IPCore是付费使用的。用户IPCore的生成如何将自己的代码封装成一个IPCore?可以提供给他人使用,但不想被篡改或者开源方法:提供verilogwrapper文件(.v文件),只提供端口描述和参数;提供.edn文件或者.ngc文件等同名的网表文件。用户约束文件(UCF)UCF是项目实现不可缺少的部分UCF生成方法1NewSouce->ImplementationConstraintsFile模块关联非常重要用户约束文件(UCF)UCF生成方法2UserConstraints用户约束文件(UCF)UCF主要三个组成部分引脚约束:引脚位置和类型配置;面积约束:模块的布局布线区域配置;时序约束:时钟约束、关键路径约束等。UCF语法:类似于一种脚本语言

{NET|INST|PIN}“Signal_name”Attribute图形工具:PACE编辑器,约束编辑器参见教材4.4节自行学习用户约束文件(UCF)引脚约束用户约束文件(UCF)引脚约束引脚的参数可以进一步配置用户约束文件(UCF)引脚约束配置成功后,打开.ucf文件用户约束文件(UCF)面积约束将Logic的模块指定到芯片的某个区域编辑一般不需要用户约束文件(UCF)时钟约束全局约束 必选,主要针对全局时钟引脚时序约束 padtopad,clocktopad高级约束 分组约束,高级时序约束特定约束 特定约束(较少使用)语法规则较为复杂用户约束文件(UCF)重新查看.ucf文件用户约束文件(UCF)关于UCF文件的几点说明UCF语法较为复杂,需要确切知道含义;图形界面的选项可以自动转换为UCF语句;如果要在FPGA上实现,时钟约束、引脚约束必填;UCF通常关联顶层模块,综合选项中默认包含;UCF引脚配置要非常小心,严格遵照PCB图和芯片手册的要求,否则可能烧毁昂贵的FPGA芯片;某些特殊引脚约束或者复杂约束,只能通过UCF语句来生成;UCF编写不正确,无法进行综合以后的后续步骤。ISEimplementdesign配置Implement在综合之后执行,需要有.ucf文件包括Translate、Map、Place&Route属性卡可以集中修改,也可以分项修改每个步骤都会生成分析报告详细属性配置参考教材4.3.3节ISEimplementdesign配置Translate属性通常使用默认属性生成.ngd文件所包含的三个工具 较少使用ISEimplementdesign配置Translate报告ISEimplementdesign配置Map属性通常使用默认属性主要需要调整的属性:LUT输入面积与速度IOB所包含的四个工具 较少使用ISEimplementdesign配置Map报告(很长,关注以下几个部分)ISEimplementdesign配置Place&Route属性主要需要调整的属性:布线努力程度运行开销表部分工具比较重要ISEimplementdesign配置Place&Route报告(也很长)静态时序分析与布局布线后仿真静态时序分析当布局布线效果不理想时使用产生布局布线静态时序使用TimingAnalyzer进行分析静态时序分析与布局布线后仿真错误时序会被标红静态时序分析与布局布线后仿真三种后仿真生成文件GeneratePost-TranslateSimulationModelxxx_translate.vGeneratePost-MapSimulationModel

xxx_map.v,xxx_map.sdfGeneratePost-Place&RouteSimulationModel主要使用布局布线后仿真xxx_timsim.v,xxx_timsim.sdf静态时序分析与布局布线后仿真布局布线后仿真方法新建一个目录,将编写的仿真测试文件、xxx_timsim.v、xxx_timsim.sdf、glbl.v文件复制到此目录下;(注意:一定不要编写的源代码,glbl.v在ISE根目录/verilog/src下)如果使用了宏定义文件(.v)、其他仿真模型文件(.v)也添加进来;打开ModelSim,新建一个Project,添加上述文件;编译所有文件;vsim-LXilinxCoreLib_ver-Lunisims_ver-Lsimprims_ver-t1ps+maxdelayssimulate_moduleglbl静态时序分析与布局布线后仿真将uut(例化的源代码顶层)添加到波形中静态时序分析与布局布线后仿真后仿真也可以采用非命令行方法,请自行查阅相关资料;后仿真时间较长,与功能仿真可能相差几个数量级的时间;如果源代码较为庞大,生成后仿真模型的过程也会比较耗时。功耗分析XPower功耗分析在仿真文件中某个initial语句中需要增加

$dumpfile("design.VCD"); $dumpvars(1,test_v.uut);运行GeneratePowerData运行AnalyzePower功耗分析分析报告功耗分析XPower使用(后续部分参考教材4.3.5节)FPGA的配置FPGA配置模式主模式 PROM配置(最终产品)从模式JTAG模式 主机配置(调试)JTAGJointTestActionGroup一种国际标准测试协议JTAG边界扫描TDI、TDO、TMS、TCKVCC、GNDFPGA的配置JTAG下载电缆并口电缆ParallelIII 电路公开,可自行制作ParallelIVUSB电缆价格较为昂贵,速度和稳定性远优于并口电缆JTAG配置电路参见教材5.3节自行学习菊花链FPGA的配置配置文件的生成PC调试的配置选项CCLK用于主模式PROM配置,内部产生JTAGCLOCK用于JTAG调试FPGA的配置配置文件的生成执行生成.bit文件FPGA的配置启动iMPACT选择边界扫描也可以取消 然后点击 进行自动检测FPGA的配置下载配置右键Program,选中生成的.bit文件下载成功后,提示“Success”FPGA的配置采用PROM配置FPGA生成的.bit文件需要转换成.mcs文件下载到PROM中,PROM自动配置FPGA执行FPGA的配置选择所使用PROM芯片FPGA的配置选择.bit文件转换(注意:此时要用CCLK时钟生成.bit)FPGA的配置JTAG菊花链FPGA的配置多片PROM配置SoC基本概念SoC(SystemonChip)片上系统狭义:信息系统核心的芯片集成,将系统关键部件集成在一块芯片上广义:微小型系统SoC在集成电路(IC)向集成系统(IS)转变大方向下产生

1994年Motorola的FlexCore系统1995年LSILogic公司为Sony公司设计的SoCSoC技术特点半导体工艺技术的系统集成软件系统和硬件系统的集成SoC具有以下几方面的优势,因而创造其产品价值与市场需求:降低耗电量减少体积增加系统功能提高速度节省成本

SoC设计的关键技术总线架构IP核复用软硬件协同设计SoC验证可测性设计低功耗设计超深亚微米电路实现嵌入式软件移植与开发SoC发展趋势SoC芯片的规模一般远大于普通的ASIC;SoC仿真与验证最复杂、最耗时,先进的设计与仿真验证方法成为SoC设计成功的关键;

除了那些无法集成的外部电路或机械部分以外,其他所有的系统电路全部集成在一起;

高度集成化、固件化;基于SoC开发平台,最大程度系统重用。

基于FPGA的SoC应用技术系统功能集成是SoC的核心技术

固件集成是SoC的基础设计思想

嵌入式系统是SoC的基本结构

IP是SoC的设计基础片上总线IP核互连一般采用总线的方式,这种总线称为片上总线(On-ChipBus,OCB)ARM公司的AMBA总线Altera公司Avalon总线IBM公司的CoreConnect总线OpenCore组织的Wishbone总线OpenCore组织的OPC总线片上总线AMBA总线AdvancedMicrocontrollerBusArchitectureARM公司设计的用于高性能嵌入式系统的总线标准,独立于处理器和制造工艺技术片上总线AMBA总线AHB(AdvancedHighPerformanceBus)ASB(AdvancedSystemBus)APB(AdvancedPerpheralBus)片上总线AVALON总线Altera在推出业内第一个软核Nios时开发的片上总线一种简单的总线协议,规定了主部件和从部件之间进行连接的端口和通信的时序

片上总线CoreConnect总线IBM公司设计的一种SoC总线协议,能够使处理器、内存控制器和外设在基于标准产品平台设计中的集成和复用更加灵活,从而提高系统性能。片上总线CoreConnect总线处理器局部总线PLB(ProeessorLocalBus):高速的CPU核、高速存储器控制器、仲裁器、高速的DMA控制器等高性能、宽带宽的设备都连接在PLB上。片内外设总线OPB(On-ChipPeripheralBus):低性能的设备都连接在OPB总线上。器件控制寄存器总线DCR(DeviceControlRegister):配置PLB和OPB主/从设备中的状态寄存器和控制寄存器。片上总线Wishbone总线Silicore公司提出,现在已被移交给OpenCores组织维护结构十分简单,它仅仅定义了一条高速总线用户可以按需要自定义Wishbone标准,如字节对齐方式、标志位等片上总线Wishbone总线互连方式点到点(point-to-point):用于两IP核直接互连;数据流(dataflow):用于多个串行IP核之间的数据并发传输;共享总线(sharedbus):多个IP核共享一条总线;交叉开关(crossbarswitch):同时连接多个主从部件,提高系统吞吐量。片上总线Wishbone总线WISHBONESystem-on-Chip(SoC)InterconnectionArchitectureforPortableIPCores片上总线典型主从设备连接单个读周期单个写周期片上总线BIGENDIAN片上总线LITTLEENDIAN嵌入式RISCCPUAlteraNois系列XilinxPowerPC(硬核)PicoBlaze(8位微处理器软核)MicroBlaze(32位微处理器软核,支持CoreConnect总线的标准外设集合)基于EDK开发:EDK中提供的IP核均有相应的设备驱动和应用接口,只需利用相应函数库,就可以编写自己的应用软件和算法程序;对于用户自己开发的IP核,需要自己编写相应的驱动和接口函数。嵌入式RISCCPUGaislerLeon系列(SparcV8架构,开源,完整的工具链)SunOpenSparc(SparcV9架构,开源)OpencoresOpenRiscZPU(最小的32位RISC软核)几十种CPU软核软件无线电软件无线电(SoftwareRadio)在开放公共硬件平台上利用可编程的软件方法实现所需要的无线电系统。基本思想:将宽带模数变换器(A/D)及数模变换器(D/A)尽可能地靠近射频天线(模拟信号的数字化过程尽可能地接近天线

)通过软件编程来完成传送信息抽样、量化、编码/解码、运算处理和变换。通过软件编程实现不同的信道调制方式的选择,如调幅、调频、单边带、数据、跳频和扩频。通过软件编程实现不同的保密结构、网络协议和控制终端功能。软件无线电软件无线电AD->DSP->DAAD->DSP+FPGA->DAAD->FPGA->DA编程最终将向FPGA逻辑设计过渡,以嵌入式SoC系统为核心。芯片级应用系统FPGA的两个走向高度并行专用电路设计追求高速度高度的电路优化灵活的SoC系统设计追求灵活性、高性价比嵌入式CPU为核心的软硬件协同设计SoC验证VerilogHDL历史1983年,GatewayDesignAutomation公司推出Verilog语言,开发了仿真与验证工具;1985年,GDA推出Verilog仿真器Verilog-XL:仿真速度快,处理能力强,具有交互式调试手段;1987年,Synopsys公司的综合软件开始接受Verilog输入;1989年,Cadence公司收购GDA,进一步扩大Verilog的影响;1990年,OpenVerilogInternational(OVI)成立,推广VerilogHDL和Veriog-XL被广泛推广;1993年,OVI推出Verilog2.0,作为IEEE提案提出申请;1995年,IEEE(InstituteofElectricalandElectronicsEngineers)通过VerilogHDL标准IEEEStd.1364-1995;2001年,IEEE发布了VerilogIEEE1364-2001标准。本课程以IEEEStd.1364-1995为主VerilogHDL现状VerilogHDL是最广泛使用的、具有国际标准支持的硬件描述语言,绝大多数的EDA厂商都支持;在工业界和ASIC设计领域,VerilogHDL应用更加广泛。VerilogHDL与VHDLVHDLVery-High-SpeedIntegratedCircuitHardwareDescriptionLanguage诞生于1982年;1987年底被IEEE和美国国防部确认为标准硬件描述语言。IEEE1076(1983)IEEE1076-1995……VerilogHDL与VHDL建模层次系统级(system):

用高级语言结构实现设计模块的外部性能的模型。算法级(algorithmic):

用高级语言结构实现设计算法的模型。

RTL级(RegisterTransferLevel):

描述数据在寄存器之间流动和如何处理这些数据的模型。

门级(gate-level):

描述逻辑门以及逻辑门之间的连接的模型。开关级(switch-level):

描述器件中三极管和储存节点以及它们之间连接的模型。VerilogHDL与VHDL相同点:都能形式化抽象表示电路行为和结构;支持逻辑设计中层次与范围的描述;具有电路仿真和验证机制;与工艺无关。不专门面向FPGA设计不同点:Verilog与C语言相似,语法灵活;VHDL源于Ada语言,语法严格;Verilog更适合ASIC设计。SystemVerilog与SystemCSystemVerilog:IEEE1364Verilog-2001标准的扩展增强,兼容Verilog2001,将硬件描述语言(HDL)与现代的高层级验证语言(HVL)结合。SystemC:一种软/硬件协同设计语言,既是系统级语言,也是硬件描述语言。系统建模设计方法学自顶向下自底向上混合式描述方式数据流描述:描述电路数据流行为:assign行为描述:描述功能:initial,always结构化描述:描述元器件间连接关系:例化混合描述:Verilog允许多描述方式共存于同一模块。简单的Verilog程序moduletrist1(out,in,enable);

outputout; /*输出信号*/

inputin,enable;//输入信号

mytritri_inst(out,in,enable);endmodulemodulemytri(out,in,enable);

outputout;

inputin,enable;

assignout=enable?in:'bz;endmodule三态门模块trist1调用模块mytri的实例元件tri_inst;通过这种结构性模块构造可构成特大型模块。简单的Verilog程序三态门(综合)简单的Verilog程序VerilogHDL程序是由模块构成的;每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行逻辑描述;VerilogHDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行;除了endmodule语句外,每个语句和数据定义的最后必须有分号。同一电路的多种描述方法二选一的选择器门级(结构化)描述modulemuxtwo(out,a,b,sl);

inputa,b,sl;

outputout;

wirensl,sela,selb;

not#1u1(nsl,sl); //#1是仿真延迟

and#1u2(sela,a,nsl);

and#1u3(selb,b,sl);

or#1u4(out,sela,selb);endmodule

RTL级行为描述modulemuxtwo(out,a,b,sl);

inputa,b,sl;

outputout;

regout;

always@(sloraorb)

if(!sl)out=a;

elseout=b;endmodule

布尔代数级行为描述modulemuxtwo(out,a,b,sl);

inputa,b,sl;

outputout; assignout=sel?b:a;endmodule

同一电路的多种描述方法二选一的选择器(综合)混合描述混合设计方式的1位全加器实例moduleFA_Mix(A,B,Cin,Sum,Cout);

inputA,B,Cin;

outputSum,Cout;

regCout;

regT1,T2,T3;

wireS1;

xorX1(S1,A,B); //门实例语句。

always@(AorBorCin) //always语句。

begin T1=A&Cin; T2=B&Cin; T3=A&B; Cout=(T1|T2)|T3;

end

assignSum=S1^Cin; //连续赋值语句。endmodule混合描述混合设计方式的1位全加器实例(综合)模块基本结构module模块名(端口列表);端口I/O说明 内部信号声明 功能定义endmodule时延VerilogHDL模型中的所有时延都根据时间单位定义。下面是带时延的连续赋值语句实例。

assign

#2Sum=A^B;#2指2个时间单位。使用编译指令将时间单位与物理时间相关联。这样的编译器指令需在模块描述前定义,如下所示:

`timescale

1ns/100ps此语句说明时,延时间单位为1ns并且时间精度为100ps(时间精度是指所有的时延必须被限定在0.1ns内)。如果此编译器指令所在的模块包含上面的连续赋值语句,#2代表2ns。如果没有这样的编译器指令,VerilogHDL模拟器会指定一个缺省时间单位。IEEEVerilogHDL标准中没有规定缺省时间单位。语言要素:标识符所谓标识别符就是用户为程序描述中的Verilog对象所起的名字。模块名、变量名、常量名、函数名、任务名标识符必须以英语字母(a-z,A-Z)起头,或者用下横线符(_)起头。其中可以包含数字、$符和下划线符。标识符最长可以达到1023个字符。模块名、端口名和实例名都是标识符。Verilog语言大小写敏感,sel和SEL是两个不同的标识符。所有的关键词都是小写的。语言要素:系统任务和函数以$字符开始的标识符表示系统任务或系统函数。任务可以返回0个或多个值,函数除只能返回一个值以外与任务相同。函数在0时刻执行,即不允许延迟,而任务可以带有延迟。常用于测试模拟,一般不用于源代码设计。$display

("Hi,youhavereachedLTtoday"); /*$display系统任务在新的一行中显示。*/$time //该系统任务返回当前的模拟时间。语言要素:编译指令以`(反引号)开始的某些标识符是编译器指令。`define和`undef,很像C语言中的宏定义指令`ifdef、`else和`endif,用于条件编译`include文件既可以用相对路径名定义,也可以绝对路径`timescale编译器指令将时间单位与实际时间相关联。该指令用于定义时延的单位和时延精度。语言要素:值集合VerilogHDL有下列四种基本的值:0:逻辑0或“假”1:逻辑1或“真”x:未知z:高阻(x,z不区分大小写)VerilogHDL中有三类常量:整型实数型字符串型语言要素:常量1.整数表达方式:<位宽>’<进制><数字>:标准方式’<进制><数字>:默认位宽,与机器类型有关<数字>:不指明进制默认为十进制进制二进制(b或B):8’b10101100,’b1010十进制(d或D):4’d1543,512十六进制(h或H):8’ha2八进制(o或O):6’O41x和z值x:不确定:4’b100xz:高阻:16’hzzzz,没有驱动元件连接到线网,线网的缺省值为z。语言要素:常量负数:在位宽表达式前加一个减号,如-8’d5减号不可以放在位宽和进制之间,也不可以放在进制和具体的数之间,如8’d-5下划线:只能用在具体的数字之间,如16’b1010_1111_1010位数指的是二进制位数。数位扩展:(定义的长度比为常量指定的长度长)最高位是0、1,高位用0扩展:8’b1111等于8’b00001111最高位是z、x,高位自动扩展:4’bz等于4’bzzzz数位截断:如果长度定义得更小,最左边的位被截断,如:3‘b1001_0011等于3’b011,5'H0FFF等于5'H1F语言要素:常量2.实数十进制计数法;例如

2.0 5.68科学计数法;23_5.1e2其值为23510.0,忽略下划线3.6E2其值为360.0(e与E相同)

实数通常不用于FPGA源代码的常量语言要素:常量3.字符串字符串是双引号内的字符序列。字符串不能分成多行书写。例如:

"INTERNALERROR"

"REACHED->HERE“用8位ASCII值表示的字符可看作是无符号整数。为存储字符串“INTERNALERROR”,变量需要8*14位。reg

[1:8*14]Message;(Message=“INTERNALERROR“)字符串较少用于FPGA源代码的常量语言要素:数据类型两大类数据类型线网型寄存器型线网型包含下述不同种类的线网子类型wire //FPGA设计中,通常只用wire型triwortriorwandtriandtriregtri1tri0supply0supply1msb和lsb定义了范围,并且均为常数值表达式。范围定义是可选的;如果没有定义范围,缺省值为1位线网wireReset;wire[3:0]data_in;wire[3:2]select;wire[0:2]point;wire

[msb:lsb]reg1,reg2,...regN;语言要素:数据类型寄存器型5种不同的寄存器类型。reg

//FPGA设计中,通常只用reg型,默认初始值x。integer//其他类型用于仿真timerealrealtimemsb和lsb定义了范围,并且均为常数值表达式。范围定义是可选的;如果没有定义范围,缺省值为1位寄存器reg

Reset;reg[3:0]data_in;reg[3:2]select;reg[0:2]point;reg

[msb:lsb]reg1,reg2,...regN;语言要素:数据类型存储器存储器是一个寄存器数组。存储器使用如下方式说明reg[msb:lsb]memory1[upper1:lower1], memory2[upper2:lower2],...;reg[3:0]MyMem[63:0]//MyMem为64个4位寄存器的数组。regBog[1:5]//Bog为5个1位寄存器的数组。存储器赋值不能在一条赋值语句中完成,寄存器可以。存储器常用于FPGA外围器件的仿真建模语言要素:数据类型存储器赋值2)系统任务赋值reg

[3:0]RomB[7:0];$readmemb

("ram.patt",RomB);

Romb是存储器。文件“ram.patt”必须包含二进制值。文件也可以包含空白空间和注释。下面是文件中可能内容的实例。11011110100001110000100100110001语言要素:数据类型存储器赋值1)对每个单元逐一赋值reg[0:3]Xrom[0:2];...Xrom[0]=4'hA;Xrom[1]=4'h8;Xrom[2]=4‘hF;语言要素:参数参数是一个常量,常用于定义时延和变量的宽度。parameterLINELENGTH=132;parameterALL_X_S=16'bx;parameterBIT=1,BYTE=8,PI=3.14;parameterSTROBE_DELAY=(BYTE+BIT)/2;参数值也可以在编译时被改变。改变参数值可以使用参数定义语句或通过在模块初始化语句中定义参数值语言要素:空白符、注释除了字符串中的空白符,其他空白符编译被忽略注释多行注释/**/(不允许嵌套)单行注释//`1使用`timescale编译器指令的目的是什么?2写出产生下图所示波形的变量BullsEye的初始化语句。3使用数据流描述方式编写下图所示的异或逻辑的VerilogHDL描述,并使用规定的时延。4下列表达式的位模式是什么?

7'o44,'Bx0,5'bx110,'hA0,10'd2,'hzF

表达式表达式由操作数和操作符组成;表达式可以在出现数值的任何地方使用;表达式是数据流描述的基础。A&BAddr1[3:0]+Addr2[3:0]Count+1(a[0]^b[0])|(a[1]&~b[1])表达式:操作数操作数可以是以下类型中的一种:常数参数线网寄存器位选择部分选择存储器单元函数调用表达式:操作数常数表达式中的整数值可被解释为有符号数或无符号数;如果整数是基数型整数,作为无符号数对待。12 01100的5位向量形式 (有符号)-12 10100的5位向量形式 (有符号)5‘b01100 十进制数12 (无符号)参数参数类似于常量,并且使用参数声明进行说明。例如parameter

LOAD=4'd12,STORE=4'd10;LOAD和STORE为参数,值分别被声明为12和10。表达式:操作数线网

线网中的值被解释为无符号数,表达式中可使用:标量线网(1位)和向量线网(多位)。wire[3:0]led; //4位向量线网。wireline; //标量线网。assignled=4‘ha;//被赋于位向量1010,为十进制10。表达式:操作数寄存器

integer型的值被解释为有符号的二进制补码数,

reg型或time型的值被解释为无符号数,

real型和realtime的值被解释为有符号浮点数。

reg[4:0]state;State=5‘b01011;//值为位向量01011,十进制值11。State=9; //值为位向量01001,十进制值9。为何没有用assign语句赋值?表达式:操作数位选择 位选择从向量中抽取特定的位。形式如下:

net_or_reg_vector[bit_select_expr]State[1]&&State[4] //寄存器位选择。led[0]|line //线网位选择。如果选择表达式的值为x、z或越界,则位选择的值为State[x]值为x。(FPGA设计中禁用)表达式:操作数部分选择net_or_reg_vector[msb_const_expr:lsb_const_expr]State[4:1] //寄存器部分选择。 reg[4:0]state;led[2:0] //线网部分选择。 wire[3:0]led;选择范围越界或为x、z时,部分选择的值为x。(FPGA设计中禁用越界)表达式:操作数存储器单元存储器单元从存储器中选择一个memory[word_address] reg[7:0]Dram[63:0]; Dram[60]; //存储器的第61个单元。不允许对存储器变量值部分选择或位选择。

(思考:在存储器中读取一个位或部分选择一个字?)函数调用

表达式中可使用函数调用。

$time+SumOfEvents(A,B) /*$time是系统函数,并且SumOfEvents是在别处定义的用户自定义函数。*/表达式:操作符VerilogHDL中的操作符可以分为下述类型:算术操作符关系操作符相等操作符逻辑操作符按位操作符归约操作符移位操作符条件操作符连接和复制操作符表达式:操作符表达式:操作符除条件操作符从右向左关联外,其余所有操作符自左向右关联。A+B-C 等价于:(A+B)-C //自左向右A?B:C?D:F 等价于:A?B:(C?D:F) //从右向左圆扩号能够用于改变优先级(A?B:C)?D:F表达式:操作符算术运算符+(加)-(减)*(乘)

/(除)

%(取模)1)后三种不常用,是具体设计结构而定;2)任意操作数是X或Z,那么整个结果为X;3)结果的长度由最长的操作数决定;4)reg和wire保存无符号数。表达式:操作符关系操作符有:>(大于)<(小于)>=(不小于)<=(不大于)1)关系操作符的结果为真(1)或假(0);2)如果操作数中有一位为X或Z,那么结果为X。习题:求下列表达式真值23>4552<8'hxFF'b1000>='b01110表达式:操作符等式运算符(相等关系运算符)==(逻辑相等)!=(逻辑不等)===(全等)!==(非全等)1)如果比较结果为假则结果为0,为真结果为1;2)在全等比较中,值x和z严格按位比较。===01xz==01xz01000010xx10100101xxx0010xxxxxz0001zxxxx习题:求下列表达式真值假定 Data=‘b11x0; Addr=‘b11x0;求 Data==Addr

Data===Addr表达式:操作符逻辑操作符有:&&(逻辑与)||(逻辑或)!(逻辑非)1)只对逻辑值运算,结果一位,逻辑值1、0或x;2)对于向量操作,非0向量作为1处理;3)如果任意一个操作数包含x,结果也为x。习题:求下列表达式真值假定: C='b0;//0为假 D=‘b1;//1为真

A_Bus='b0110; B_Bus='b0110;求 C&&D C||D !D A_Bus&&B_Bus A_Bus||B_Bus !A_Bus表达式:操作符按位操作符有:•~(一元非)•&(二元与)•|(二元或)•^(二元异或)•~^或^~(二元异或非)操作数对应位上按位操作,并产生向量结果。习题:求下列表达式真值假定 A='b0110; B='b0100;求 A|B A&B表达式:操作符归约操作符有:&(归约与)~&(归约与非)| (归约或)~|(归约或非)^(归约异或)~^(归约异或非)在单一操作数的所有位上操作,并产生1位结果。习题:求下列表达式真值假定: A=‘b0110; B=‘b0100;

MyReg=4‘b01x0;求 ~&A ^A |B &B |MyReg ^MyReg

表达式:操作符移位操作符有:•<<(左移)>>(右移)1)左侧操作数移动右侧操作数表示的次数,逻辑移位,空闲位添0补位;2)如果右侧操作数的值为x或z,移位操作的结果为x。应用实例:使用移位操作为2-4解码器建模wire[3:0]DecodeOut;assignDecodeOut=4'b1<<Address[1:0];习题:求Qreg的值假定: reg[7:0]Qreg;

Qreg=4'b0111;移位 Qreg>>2

表达式:操作符条件操作符根据条件表达式的值选择表达式,形式: cond_expr?expr1:expr2三目运算符wire[2:0]Student;assignStudent=Marks>18?Grade_A:Grade_C;表达式:操作符位拼接运算符(连接和复制操作)连接操作:将小表达式合并形成大表达式的操作。形式:

{expr1,expr2,...,exprN}复制操作:指定重复次数来执行操作。如下:

{repetition_number{expr1,expr2,...,exprN}实例:wire[7:0]Dbus,[11:0]Abus;assignDbus[7:4]={

Dbus[0],Dbus[1],Dbus[2],Dbus[3]

};assign

Abus={3{4'b1011}}; //位向量12'b1011_1011_1011)assign

Abus={{4{Dbus[7]}},Dbus}; /*符号扩展*/习题2模块与端口模块:基本单元定义成模块形式modulemodule_name(port_list); Declarations_and_Statementsendmodule端口队列port_list列出了该模块通过哪些端口与外部模块通信。模块与端口端口模块的端口可以是

input(输入端口)、output

(输出端口)或者inout

(双向端口);缺省的端口类型为wire型;output或inout能够被重新声明为reg型,但是input不可以;线网或寄存器必须与端口说明中指定的长度相同。模块与端口例:moduleMicro(PC,Instr,NextAddr);//端口说明input[3:1]PC;output[1:8]Instr;inout[16:1]NextAddr;//重新说明端口类型:wire[16:1]NextAddr;//该说明是可选的,但如果指定了,就必须与它的端口说明保持相同长度。reg[1:8]Instr;//Instr已被重新说明为reg型,因此能在always语句或在initial语句中赋值。...endmodule模块与端口模块实语句一个模块能够在另外一个模块中被引用,这样就建立了描述的层次。模块实例语句形式

module_nameinstance_name(port_associations);信号端口可以通过位置或名称关联;但是关联方式不能够混合使用。端口官廉形式

port_expr //通过位置,隐式关联

.PortName(port_expr) //通过名称,显示关联,强烈推荐!

port_expr可以是以下的任何类型:1)标识符(reg型或wire型)2)位选择3)部分选择4)上述类型的合并5)表达式(只适用于input型信号)MicroM1

(

UdIn[3:0],{WrN,RdN},Status[0],Status[1],

&UdOut[0:7],TxData);模块与端口使用两个半加器模块构造全加器moduleHA(A,B,S,C);inputA,B;outputS,C;assignS=A^B;assignC=A&B;endmodulemoduleFA(P,Q,Cin,Sum,Cout);inputP,Q,Cin;outputSum,Cout;wireS1,C1,C2;HAh1(P,Q,S1,C1); //通过位置关联。HAh2(.A(Cin),.S(Sum),.B(S1),.C(C2));//通过端口与信号的名字关联。orO1(Cout,C1,C2); //或门实例语句endmodule考虑如何模块参数化?模块与端口使用两个半加器模块构造全加器(模块参数化)moduleHA(A,B,S,C);inputA,B;outputS,C;parameterAND_DELAY=1,XOR_DELAY=2;assign

#XOR_DELAYS=A^B;assign

#AND_DELAYC=A&B;endmodulemoduleFA(P,Q,Cin,Sum,Cout);inputP,Q,Cin;outputSum,Cout;parameterOR_DELAY=1;wireS1,C1,C2;HAh1(P,Q,S1,C1); //通过位置关联。HAh2(.A(Cin),.S(Sum),.B(S1),.C(C2));//通过端口与信号的名字关联。or

#OR_DELAYO1(Cout,C1,C2); //或门实例语句endmodule模块与端口悬空端口通过将端口表达式表示为空白来指定为悬空端口DFFd1(.Q(QS),.Qbar(),.Data(D),.Preset(),.Clock(CK));端口长度不同通过无符号数的右对齐或截断方式进行匹配moduleChild(Pba,Ppy);input[5:0]Pba;output[2:0]Ppy;...endmodulemoduleTop;wire[1:2]Bdl;wire[2:6]Mpr;ChildC1(.Pba(Bdl),.Ppy(Mpr));endmodule模块与端口模块参数值改变1)参数定义语句(defparam)moduleTOP(NewA,NewB,NewS,NewC);inputNewA,NewB;outputNewS,NewC;defparamHa1.XOR_DELAY=5,//实例Ha1中的参数XOR_DELAY。Ha1.AND_DELAY=2;//实例Ha1中参数的AND_DELAY。HAHa1(NewA,NewB,NewS,NewC);endmodule模块与端口模块参数值改变2)带参数值的模块引用moduleTOP(NewA,NewB,NewS,NewC);inputNewA,NewB;outputNewS,NewC; HA#(5,2)Ha1(NewA,NewB,NewS,NewC);//第1个值5赋给参数AND_DELAY,该参数在模块HA中说明。//第2个值2赋给参数XOR_DELAY,该参数在模块HA中说明。endmodule模块与端口外部端口显式地指定外部端口。(较少使用)moduleScram_B(.Data(Arb),.Control(Ctrl),.Mem_Word(Mem_Blk),.Addr(Byte));input[0:3]Arb;inputCtrl;input[8:0]Mem_Blk;output[0:3]Byte;...endmodule习题31.模块实例语句与门实例语句的区别是什么?2.当端口悬空时,即端口没有被连接时,端口的值是什么?3.用本章讲述的模块FA编写执行加法和减法的4位ALU的结构模型。门级建模FPGA设计中较少使用VerilogHDL中提供下列内置基本门:1)多输入门:

and,nand,or,nor,xor,xnor2)多输出门:

buf,not3)三态门:

bufif0,bufif1,notif0,notif14)上拉、下拉电阻:

pullup,pulldown5)MOS开关:

cmos,nmos,pmos,rcmos,rnmos,rpmos6)双向开关:

tran,tranif0,tranif1,rtran,rtranif0,rtranif1用于定义原语(UDP)FPGA设计中通常不使用;UDP实例语句的语法与基本门的实例语句语法一致;UDP中可以描述组合电路和时序电路。PrimitiveD_Edge_FF(Q,Clk,Data);outputQ;regQ;inputData,Clk;initialQ=0;table //ClkDataQ(State)Q(next) (01)0:?:0;(01)1:?:1;(0x)1:1:1;(0x)0:0:0; //忽略时钟负边沿:

(?0)?:?:-; //忽略在稳定时钟上的数据变化

(??)?:?:-;endtableendprimitive数据流建模连续赋值用于数据流建模(描述),生成组合逻辑电路。连续赋值使用连续赋值语句assign语句,格式为:assignLHS_target=RHS_expression;例如wireZ1,Preset,Clear;//线网说明assign

Z1=Preset&Clear;//连续赋值语句wire[15:0]data_in;wire[15:0]data_tmp;wiredata_tmp={data_in[7:0],data_in[15:8]};数据流建模连续赋值语句在什么时候执行呢?

只要在右端表达式的操作数上有事件发生(值变化),表达式立即被计算,新结果就赋给左边的线网。连续赋值的目标类型(左侧操作数类型)1)标量线网 assignZ1=…;2)向量线网 assigndata_tmp=…;3)向量的常数型位选择assigndata_tmp[2]=…;4)向量的常数型部分选择assigndata_tmp[7:0]=…;5)上述类型的任意的拼接运算结果

assign{Z1,data_tmp[15]}=2’b10;数据流建模例:数据流描述的一位全加器moduleFA_Df(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;assignSum=A^B^Cin;assignCout=(A&Cin)|(B&Cin)|(A&B);endmodule1)assign语句之间是并发的,与其书写的顺序无关;2)线网的赋值可以在声明时赋值,例如wireSum=A^B^Cin;数据流建模数据流建模的时延

assign

#2Sum=A^B^Cin;#2表示右侧表达式的值延迟两个时间单位赋给Sum;时间单位是多少?由谁来决定?`timescale1ns/100psFPGA设计中的时延仅在功能仿真时有效,不影响实际电路生成。数据流建模数据流建模注意事项:1)wire型变量如果不赋值,默认值为z;2)数据流建模没有存储功能,不能保存数据;3)wire型变量只能在声明时赋值或者assing语句赋值;4)assign语句并发执行,实际的延迟又物理芯片的布线结果决定。5)最基本的FPGA设计源代码描述语句之一,用于生成组合逻辑,定制LUT的逻辑功能。常作为中间信号的描述用于控制寄存器的输入输出。习题41.使用assign语句描述一个时钟信号clk,频率为100MHz。

assign#5clk=~clk;2.请指出下列语句是否合法?描述了怎样的功能?assignMux=(S==0)?A:'bz;assignMux=(S==1)?B:'bz;assignMux=(S==2)?C:'bz;assignMux=(S==3)?D:'bz;行为建模过程赋值用于行为建模(描述)行为建模的主要机制:1)initial语句 主要用于仿真文件(模拟)2)always语句 用于源文件和仿真文件所有initial语句和always语句之间都是并发执行;执行顺序与其在模块中书写顺序无关。行为建模:initial语句initial语句只执行一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论