基于FPGA的科研训练范例-薛冰许德新_第1页
基于FPGA的科研训练范例-薛冰许德新_第2页
基于FPGA的科研训练范例-薛冰许德新_第3页
基于FPGA的科研训练范例-薛冰许德新_第4页
基于FPGA的科研训练范例-薛冰许德新_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、基于FPGA的科研训练范例8.1 可编程逻辑器件基本知识可编程逻辑器件(Programmable Logic Device,PLD)起源于20世纪70年代,是在专用集成电路(ASIC)的基础上发展起来的一种新型逻辑器件,是当今数字系统设计的主要平台,其主要特点是完全由用户通过软件进行配置和编程,从而完成特定的功能,且可以反复擦写。8.1.1 可编程逻辑器件的发展及分类可编程逻辑器件根据集成密度可分为低密度可编程逻辑器件(LDPLD)和高密度可编程逻辑器件(HDPLD)两类。LDPLD主要是指早期发展起来的PLD,它包括PROM、PLA、PAL和GAL四种,其集成密度一般小于700门/片,这里的

2、门是指PLD等效门。HDPLD包括EPLD、CPLD和FPGA三种,其集成密度大于700门/片。随着集成工艺的发展,HDPLD的集成密度不断增加,性能不断提高。目前集成度最高的HDPLD可达数百万门/片。目前,常用的可编程逻辑器件都是从与或阵列和门阵列发展起来的,所以可以从结构上将其分为两大类:(1) 阵列型PLD。(2) 现场可编程门阵列FPGA。阵列型PLD的基本结构由与阵列和或阵列组成。简单PLD(PROM、PLA、PAL和GAL)、EPLD和CPLD都属于阵列型PLD。可擦除可编程逻辑器件EPLD(Erasable PLD) 是Altera公司推出的基于E2CMOS编程工艺的PLD,其

3、基本逻辑单元是宏单元。宏单元由可编程的与或阵列、可编程寄存器和可编程I/O三部分组成;复杂可编程逻辑器件CPLD(Complex PLD)是上个世纪80年代末Lattice公司提出在系统可编程(ISP,In System Programmability)技术以后于90年代初出现的。它是在EPLD的基础上发展起来的,采用E2CMOS工艺制作,与EPLD相比,增加了内部连线,对逻辑宏单元和I/O单元也有重大的改进。现场可编程门阵列FPGA(Field Programmable Gate Array)是Xilinx公司1985年推出的,采用CMOS-SRAM编程工艺制作。其内部由可构造逻辑模块(CL

4、B)、可构造输入输出块(IOB)和可编程互连资源(IR)组成。具有集成密度高、编程速度快、设计灵活及可再配置等特点。FPGA基于SRAM的架构,集成度高,以LE(包括查找表、触发器及其他)为基本单元,有内嵌Memory、DSP等,支持IO标准丰富。具有易挥发性,需要有上电加载过程。在实现复杂算法、队列调度、数据处理、高性能设计、大容量缓存设计等领域中有广泛应用,如Altera公司的 Stratix、cyclone系列。尽管FPGA和CPLD都是可编程ASIC器件,有很多共同特点,但CPLD和FPGA结构上的差异使它们具有各自的特点:1.CPLD更适合完成各种算法和组合逻辑,FPGA更适合于完成

5、时序逻辑。换句话说,FPGA更适合于触发器丰富的结构,而CPLD更适合于触发器有限而乘积项丰富的结构。2.FPGA的集成度比CPLD高,具有更复杂的布线结构和逻辑实现。3. 在编程方式上,CPLD主要是基于E2PROM或FLASH存储器编程,编程次数可达1万次以上,优点是系统断电时编程信息也不丢失。FPGA大部分是基于SRAM编程,编程信息在系统断电时丢失,每次上电时,需从器件外部将编程数据重新写入SRAM中。其优点是可以编程任意次,可在工作中快速编程,从而实现板级和系统级的动态配置。8.1.2 Verilog HDL语言简介Verilog硬件描述语言是描述电子电路行为和结构的一种语言是一种I

6、EEE标准(IEEEStd.1364-1995)。Verilog用于模拟从随机和纯行为到门级和开关级的抽象范围等层次的数字电子电路功能也用于从许多抽象(寄存器传输级)描述合并(即自动产生)门级描述Verilog。一般用于支持高层次的设计)或基于语言的设计),其中电子设计在用自动合并工具进行详细设计前要通过高层次的完全抽象仿真来检验。Verilog也广泛应用于IC的门级检验,包括仿真故障仿真和定时检验。Verilog 最初是在1984年由Gateway Design Automation公司开发Verilog-XL仿真器的时候一起开发出来。1989年Cadence Design Systems公

7、司并购Gateway公司,同时拥有对Verilog语言和Verilog-X仿真器的权力。1990年Cadence将Verilog语言不是Verilog-XL放到公共领域。为了使Verilog语言通过IEEE标准化过程一个非赢利性组织,Open Verilog International OVI将它不断推进结果,在1995年Verilog 成为一个IEEE标准。用Verilog HDL描述的电路设计就是该电路的Verilog HDL模型,也称为模块,是Verilog的基本描述单位。模块描述某个设计的功能或结构以及与其他模块通信的外部接口,一般来说一个文件就是一个模块,但并不绝对如此。模块是并行运

8、行的,通常需要一个高层模块通过调用其他模块的实例来定义一个封闭的系统,包括测试数据和硬件描述。一个模块的基本架构如下: module module_name (port_list) /声明各种变量、信号 reg /寄存器 wire/线网 parameter/参数 input/输入信号 output/输出信号 inout/输入输出信号 function/函数 task/任务 /程序代码 initial assignment always assignment module assignment gate assignment UDP assignment continous assignment

9、 endmodule 说明部分用于定义不同的项,例如模块描述中使用的寄存器和参数。语句用于定义设计的功能和结构。说明部分可以分散于模块的任何地方,但是变量、寄存器、线网和参数等的说明必须在使用前出现。一般的模块结构如下: module <模块名> (<端口列表>) <定义> <模块条目> endmodule其中,<定义>用来指定数据对象为寄存器型、存储器型、线型以及过程块。<模块条目>可以是initial结构、always结构、连续赋值或模块实例。下面给出一个简单的Verilog模块,实现了一个二选一选择器。例8.1 二选

10、一选择器(见图8.1)的Verilog实现图8.1例8.1所示的二选一电路module muxtwo(out, a, b, s1); input a, b, s1; output out; reg out; always (s1 or a or b) if (!s1) out = a; else out = b; endmodule 模块的名字是muxtwo,模块有个端口:三个输入端口a、b和s1,一个输出端口out。由于没有定义端口的位数,所有端口大小都默认为位;由于没有定义端口a, b, s1的数据类型,这3个端口都默认为线网型数据类型。输出端口out定义为reg类型。如果没有明确的说明,

11、则端口都是线网型的,且输入端口只能是线网型的。8.1.3 Quartus II软件开发流程Quartus II开发软件是Altera公司的第四代可编程逻辑器件集成开发环境,提供从设计输入到器件编程的全部功能。Quartus II软件的开发流程可以基本概括为以下步骤:设计输入、对工程进行设置和约束、设计编译与综合、布局布线、设计仿真、设计时序分析和器件编程。(1) 设计输入Quartus II工程包括在可编程器件中最终实现设计需要的所有设计文件,软件源文件和其他相关文件。使用修订,可以比较工程多个版本的设置和分配,更快、更有效地满足设计要求。使用Quartus II 模块编辑器、文本编辑器、Me

12、gaWizard插件管理器和EDA 设计输入工具可以建立包括Altera宏功能模块、参数化模块库(LPM) 功能和知识产权(IP) 功能在内的设计。(2) 对工程进行设置和约束建立工程和设计之后,可以使用Quartus II软件中的Settings对话框、Assignment Editor 、Pin Planner以及Design Partitions 等窗口指定初始设计约束条件,例如:引脚分配、器件选项、逻辑选项和时序约束条件。(3) 设计编译与综合Quartus II的编译器(Compiler)完成对设计文件的分析和综合,其主要功能有:检查设计错误、对逻辑进行综合、提取定时信息、在指定的A

13、ltera系列器件中进行适配分割,产生的输入文件将用于设计仿真、定时分析及器件编程。(4) 布局布线Quartus II的适配器(Fitter)完成对设计进行布局布线,在Quartus II 软件中是指“fitting( 适配)”。Fitter 使用由前一阶段分析和综合建立的数据库,将工程的逻辑和时序要求与器件的可用资源相匹配。它将每个逻辑功能分配给最佳逻辑单元位置,进行布线和时序分析,并选定相应的互连路径和引脚分配。(5) 设计仿真可以使用EDA 仿真工具或Quartus II仿真器(Simulator)对设计进行功能与时序仿真,用以验证设计系统的功能或者时序是否正确。(6) 设计定时分析Q

14、uartus II TimeQuest 时序分析器和标准时序分析器(Classic Timing Analyzer)可用于分析设计中的所有逻辑,并有助于指导Fitter 达到设计中的时序要求。可以使用时序分析器产生的信息来分析、调试并验证设计的时序性能。还可以使用快速时序模型进行时序分析,验证最佳情况( 最快速率等级的最小延时) 条件下的时序。(7) 器件编程使用Quartus II 软件成功编译工程之后,就可以对Altera公司的CPLD/FPGA器件进行编程或配置。Quartus II Compiler 中的Assembler 模块将生成最终的编程文件,结合Altera 编程硬件(Byte

15、Blaster MV/II,MasterBlaster,USB-Blaster以及EthernetBlaster等),可以使用Quartus II 编程器(Programmer)对器件进行编程或配置。8.1.4 SOPC设计开发流程SOPC(System On Programmable Chip,可编程片上系统)是Altera公司提出的一种灵活、高效的SOC(System On Chip,片上系统)解决方案,是一种新的软硬件协同设计的系统设计技术。它将处理器、存储器、I/O接口、LVDS和CDR等系统设计需要的功能模块集成到一个可编程器件上,构成一个可编程片上系统。SOPC是PLD和ASIC技

16、术融合的结果。SOPC是一种特殊的嵌入式系统,该系统由单个芯片完成整个系统的主要逻辑功能,同时该系统灵活方便,属于可编程系统,用户可以方便地对系统进行扩展和升级。一个SOPC系统一般具备了以下几个主要的特征:(1)嵌入式处理器内核;(2)丰富的IP CORE资源;(3)片内高速RAM资源;(4)处理器调试接口以及FPGA编程接口;(5)片上可编程逻辑资源。SOPC设计包括以32位Nios II软核处理器为核心的嵌入式系统的硬件配置、硬件设计、硬件仿真、软件设计以及软件调试等。SOPC系统设计的基本软件工具有:(1)Quartus II:用于完成Nios II系统的综合、硬件优化、适配、编程下载

17、以及硬件系统调试等;(2)SOPC Builder:Altera Nios II嵌入式处理器开发软件包,用于实现Nios II系统的配置、生成;(3)Modelsim:用于对SOPC生成的Nios II系统的HDL描述进行系统功能仿真;(4)Nios II IDE:用于进行软件开发、调试,以及向目标开发板进行Flash下载。SOPC系统设计流程如图8.2所示,可以分为两大部分:SOPC Builder进行处理器及组件的生成,Quartus II软件综合布局布线。SOPC Builder需要完成整个开发中的大部分工作,其中最主要的是Nios II CPU的相关配置,在SOPC Builder中,

18、软件提供了专用的Nios II IDE来辅助开发,设计人员通过该软件进行Nios II系统开发模块的驱动程序,用户应用程序的开发。IDE提供了C/C+语言的完整开发环境,可以完全按照软件开发的模式进行代码的开发及调试。SOPC Builder完成整个嵌入式系统的所有组件配置及各组件之间的连接,并生成相关文件。Quartus II软件根据SOPC Builder生成的HDL文件,以及其他模块及IP完成整个工程的连接及综合、布局布线。完成布局布线之后,可以进行整个系统的验证调试,用户会根据需要开发相关配套软件进行验证,当验证功能正确之后,进行板级调试完成整个工程的开发。图8.2 SOPC系统设计开

19、发流程8.2 LED灯控制显示实验8.2.1 设计内容 本实验主要学习如何连接简单的输入、输出设备到一个FPGA芯片,并且用这些器件实现一个电路。我们将用DE2开发板上的拨码开关SW17-0作为输入,用LED灯作为输出。8.2.2 软件设计 1)设计一个8位的2选1多路选择器用Verilog设计一个多路选择器有很多种方法。但是在这个实验里,要求只能用门级电路描述。比如:assign m=(s&x)|(s&y);这里x和y是输入,s是选择信号,m是输出。X被定义为SW 0到7,Y被定义为SW 8到15,S被定义为SW17,M被定义为绿色的LEDG 0到7。这部分的完整代码如下:

20、module mux2to1_8(LEDR,LEDG,SW); input 17:0SW; output 17:0LEDR; output 7:0LEDG; wire s; wire 7:0X,Y,M; assign S=SW17; assign X=SW7:0; assign Y=SW15:8; assign LEDR=SW; assign LEDG=M; mux2to1 m7(S,X7,Y7,M7); mux2to1 m6(S,X6,Y6,M6); mux2to1 m5(S,X5,Y5,M5); mux2to1 m4(S,X4,Y4,M4); mux2to1 m3(S,X3,Y3,M3);

21、 mux2to1 m2(S,X2,Y2,M2); mux2to1 m1(S,X1,Y1,M1); mux2to1 m0(S,X0,Y0,M0); endmodule /1-bit 2-to1 multiplexer module mux2to1(s,x,y,m); input s,x,y; output m; assign m=(s&x)|(s&y); endmodule在这段代码里,有一个小技巧。将程序RTL代码分成2部分。1个主模块和1个多路选择器模块(mux2to1(s,x,y,m))。通过调用多选器模块,可以很容易的实现设计。2)设计一个3位的5选1多路选择器3位5选1

22、多路选择器的设计比较简单,可以使用4个3位的2选1的多路选择器组合而成,如图8.3所示。图8.3 5选1多路选择器完整代码如下: assign m21 = (S1&m01)|(S1 module mux_3bit_5to1(S,U,V,W,X,Y,M); input2:0S,U,V,W,X,Y; output2:0M; wire2:0m0,m1,m2; / Leftmost 2 to 1 Multiplexers /Top assign m00 = (S0&U0)|(S0&V0); assign m01 = (S0&U1)|(S0&V1); assign

23、 m02 = (S0&U2)|(S0&V2); /Bottom assign m10 = (S0&W0)|(S0&X0); assign m11 = (S0&W1)|(S0&X1); assign m12 = (S0&W2)|(S0&X2); /Middle Multiplexer assign m20 = (S1&m00)|(S1&m10); &m11); assign m22 = (S1&m02)|(S1&m12); /Last Multiplexer assign M0 = (S2&a

24、mp;m20)|(S2&Y0); assign M1 = (S2&m21)|(S2&Y1); assign M2 = (S2&m22)|(S2&Y2); endmodule 生成的3位5选1多路选择器框图如图8.4所示。将“选择输入端”S2:0连接到拨码开关SW1715,剩下的15个拨码开关SW140 平均分配给“3位输入端” U2:0 到Y2:0, 将拨码开关对应连接到红色LED灯LEDR上 并将输出端M 2:0连接到绿色LED灯LEDG20上,编译完成并分配管脚后将程序下载到FPGA芯片中,观察拨动拨码开关时LED灯的亮灭变化,验证每个“3位输入端”

25、U2:0 到Y2:0都可以通过“选择输入端”S2:0输出到M 2:0。图8.4 3位5选1多路选择器框图8.2.3 进一步扩展与提高根据上面的实验设计一个1位8选1多路选择器,将控制端S2:0的所有可能状态全部用上,观察拨动拨码开关时LED灯的亮灭变化情况,验证设计的正确性。8.3数码管显示实验8.3.1设计内容本实验要求用七段数码管来显示H、E、L、O,七段数码管的控制如图8.5所示,图中c2c1c0为控制端,数码管上的标号代表控制此段数码管亮灭所对应的序号。DE2开发板上的七段码数码管是共阳极(当接收到逻辑电平位“0”时数码管亮,“1”时数码管灭),图中的7-segment decoder

26、实际上是一个3-8线译码器。图8.5 七段数码管控制框图8.3.2软件设计1)1个数码管显示实验七段数码管的译码真值表见表8.1。表8.1 译码真值表控制端c2c1c0显示字符对应译码0.6000H1001000001E0110000010L1110001011O0000001100空1111111可以使用卡诺图对表达式进行化简,例如如seg6(对应译码0.6的最右边的一列),化简过程如图8.6所示:图8.6 卡诺图化简过程对于七段数码管的每一段的表达式都可以根据真值表先进行化简(当然Quartus软件的综合工具会自动化简,但是如果考综合工具化简,每个表达式就会很长),化简后的程序代码如下:m

27、odule hello_7seg(SW,LEDR,HEX0); input 2:0 SW; output 2:0 LEDR; output 0:6 HEX0; assign LEDR=SW; /Seven Segment Decoder for "HELO" assign HEX00 = SW2|SW0; assign HEX01=SW2|(SW1&SW0)|(SW1&SW0); assign HEX02=SW2|(SW1&SW0)|(SW1&SW0); assign HEX03 = SW2|(SW1&SW0); assign HEX

28、04 = SW2; assign HEX05 = SW2; assign HEX06 = SW2|SW1; endmodule2)5个数码管显示实验本实验要求用5个数码管循环显示HELLO,涉及对前面实验中程序代码的引用。5个数码管循环显示的控制方式如图8.7所示。图8.7 5个数码管循环显示的控制方式可以引用实验8.2.2中的多路选择器作为每一个七段数码管的显示控制器,不同的多路选择器连接不同的数码管,每个数码管都可以循环显示不同的字符它们都受SW17.15的控制。将实验8.2.2中2)和8.3.2中1)的代码稍修改就可直接引用至本程序。程序代码如下:module hello_5_7seg(

29、SW,HEX4,HEX3,HEX2,HEX1,HEX0); input 17:0SW; output 0:6 HEX4,HEX3,HEX2,HEX1,HEX0; wire 2:0 M4,M3,M2,M1,M0; mux_3bit_5to1 N4(SW17:15,SW14:12,SW11:9, SW8:6,SW5:3,SW2:0,M4); mux_3bit_5to1 N3(SW17:15,SW11:9,SW8:6, SW5:3,SW2:0,SW14:12,M3); mux_3bit_5to1 N2(SW17:15,SW8:6,SW5:3, SW2:0,SW14:12,SW11:9,M2); mu

30、x_3bit_5to1 N1(SW17:15,SW5:3,SW2:0, SW14:12,SW11:9,SW8:6,M1); mux_3bit_5to1 N0(SW17:15,SW2:0,SW14:12, SW11:9,SW8:6,SW5:3,M0); char_7seg H4(M4,HEX4); char_7seg H3(M3,HEX3); char_7seg H2(M2,HEX2); char_7seg H1(M1,HEX1); char_7seg H0(M0,HEX0); endmodule /implements a 7_segment decoder for H,E,L,O,and b

31、lank module char_7seg(c,display); input 2:0c; output 0:6display; /Seven Segment Decoder for "HELO" assign display0 = c2|c0; assign display1 = c2|(c0&c1)|(c1&c2&c0); assign display2 = c2|(c0&c1)|(c0&c1&c2); assign display3 = c2|(c1&c0); assign display4 = c2; assi

32、gn display5 = c2; assign display6 = c2|c1; endmodule /3BIT 5 to 1 Multiplexer Module module mux_3bit_5to1(S,U,V,W,X,Y,M); input2:0S,U,V,W,X,Y; output2:0M; wire2:0m0,m1,m2; / Leftmost 2 to 1 Multiplexers /Top assign m00 = (S0&U0)|(S0&V0); assign m01 = (S0&U1)|(S0&V1); assign m02 = (S0

33、&U2)|(S0&V2); /Bottom assign m10 = (S0&W0)|(S0&X0); assign m11 = (S0&W1)|(S0&X1); assign m12 = (S0&W2)|(S0&X2); /Middle Multiplexer assign m20 = (S1&m00)|(S1&m10); assign m21 = (S1&m01)|(S1&m11); assign m22 = (S1&m02)|(S1&m12); /Last Multiplexe

34、r assign M0 = (S2&m20)|(S2&Y0); assign M1 = (S2&m21)|(S2&Y1); assign M2 = (S2&m22)|(S2&Y2); endmodule8.3.3 进一步扩展与提高设计一个程序,使用8个数码管循环显示HELLO,如图8.8所示。图8.8 8个数码管循环显示HELLO8.4 2进制数到10进制数的转换8.4.1 设计内容本实验要求在数码管HEX3到HEX0上显示SW15-0的值。SW15-12,SW11-8,SW7-4,SW3-0分别对应于HEX3,HEX2,HEX1,HEX0。在数

35、码管上显示0-9,忽略开关表示的数值1010-1111。本实验的目的是手工推导数码管显示的逻辑,要求只用赋值语句和布尔表达式实现,并完成2进制数到10进制数之间的转换。8.4.2 软件设计1)2进制数字的显示2进制数字的显示程序比较简单,只要推导出拨码开关与数码管显示之间的逻辑关系即可,其程序代码如下:module bin_7seg(HEX3,HEX2,HEX1,HEX0,SW);input 15:0SW;output 0:6HEX3,HEX2,HEX1,HEX0;btd H3(SW15:12,HEX3);btd H2(SW11:8,HEX2);btd H1(SW7:4,HEX1);btd H

36、0(SW3:0,HEX0);endmodule/binary-to-decimalmodule btd(s,seg);input 3:0s;output 0:6seg;assign seg6=s3&s2&s1|s2&s1&s0;assign seg5=s3&s2&s0|s2&s1|s1&s0;assign seg4=s0|s2&s1;assign seg3=s3&s2&s1&s0|s2&s1&s0|s2&s1&s0;assign seg2=s2&s1&

37、s0;assign seg1=s2&s1&s0|s2&s1&s0;assign seg0=s2&s1&s0|s3&s2&s1&s0;endmodule 2)2进制数转换为10进制数将4位二进制数V=v3v2v1v0转换成2位十进制数D=d1d0,在HEX1和HEX0上分别显示d1和d0,输出值与输入值的对应关系如表8.2:表8.2 二进制与十进制对应关系图8.9给出了电路的部分设计。比较器comparator用来检测V9,电路A用来将9的输入转换成对应的个位的BCD码电路B用来将位二进制的输入转换为对应的BCD码显示。图8

38、.9 二进制到十进制转换电路对应的程序代码:module bin2dec(V,HEX1,HEX0);input 3:0V;output 0:6HEX1,HEX0;wire z; /comparator outputwire 2:0a; /circuit A outputwire 3:0m; /multiplexer outputcomparator C(V,z);circuita A(V2:0,a);mux_4b_2to1 M(V,1'b0,a,z,m);circuitb B(z,HEX1);btd D(m,HEX0);endmodule module circuitb(z,seg);

39、input z;output 0:6seg;assign seg6=1;assign seg5=z;assign seg4=z;assign seg3=z;assign seg2=0;assign seg1=0;assign seg0=z;endmodulemodule mux_4b_2to1(x,y,s,m);input 3:0x;input 3:0y;input s;output 3:0m;mux_2to1 u3(x3,y3,s,m3);mux_2to1 u2(x2,y2,s,m2);mux_2to1 u1(x1,y1,s,m1);mux_2to1 u0(x0,y0,s,m0);endmo

40、dule module mux_2to1(a,b,s,m);input a,b,s;output m;assign m=s?b:a;endmodulemodule circuita(v,a);input 2:0v;output 2:0a;assign a2=v2&v1;assign a1=v2&v1;assign a0=(v1&v0)|(v2&v0);endmodule/circuit comparatormodule comparator(v,z);input 3:0v;output z;assign z=(v3&v2)|(v3&v1);end

41、module8.4.3 进一步扩展与提高根据上面的实验,设计一个将7位二进制数V= v6v5v4v3v2v1v0转换成3位十进制数D= d2d1d0的程序。8.5 BCD码加法器8.5.1 设计内容本实验学习利用FPGA硬件来实现加法的原理,主要包括基本的全加器以及行波进位加法器的设计,并在此基础上学习1位BCD加法器的设计。8.5.2 软件设计1)行波进位加法器行波进位加法器的框图如图8.10所示:图8.10 行波进位加法器框图图8.10a 给出了一位全加器的电路图,其输入端为加数a,b以及来自低位的进位端,输出端为和s和向高位的进位端。图8.10b和图8.10c分别给出了一位全加器的表示符

42、号和真值表,两个一位二进制数求和由 s = a + b + 计算,由四个一位全加器按照图8-10d的连接方式便可以构成一个4位的行波进位加法器。程序代码如下:module four_rc_adder(SW,LEDR,LEDG);input 8:0SW;output 8:0LEDR;output 4:0LEDG;wire 3:0a,b;wire cin;wire 3:0s;wire cout;wire 3:1c;assign LEDR=SW;assign cin=SW8;assign a=SW7:4;assign b=SW3:0;assign LEDG4=cout;assign LEDG3:0=

43、s;fadder fao(cin,a0,b0,s0,c1);fadder fa1(c1,a1,b1,s1,c2);fadder fa2(c2,a2,b2,s2,c3);fadder fa3(c3,a3,b3,s3,cout);endmodule/full addermodule fadder(ci,a,b,s,co);input ci,a,b;output s,co;assign s=ciab,co=(ab)?ci:b;endmodule2)1位BCD加法器BCD(Binary-Coded Decimal)码也叫做二进码十进数或二-十进制代码。用4位二进制数来表示1位十进制数中的09这10个数

44、码。是一种二进制的数字编码形式, BCD码这种编码形式利用四个二进制位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。例如十进制数59的BCD码为0101 1001。本实验设计一个十进制求和电路,输入为两个1位BCD码加数A和B,低位进位端carry-in,输出为两个加数的和(用两位BCD码表示)S1S0,注意处理和的最大值:S1S0=9+9+1=19。程序代码如下:/circuit Amodule circuit_A(s,ao);input 3:0s;output 3:0ao;assign ao3=s3&s2&s1,ao2=(s3&s2&s

45、1)|(s3&s2&s1),ao1=(s3&s2&s1)|(s3&s2&s1),ao0=(s3&s2&s0)|(s3&s2&s0)|(s2&s1&s0);endmodule /4-bit 2-to-1 multiplexermodule mux2to1_4b(x,y,s,m);input 3:0x,y;input s;output 3:0m;mux_2to1 u3(x3,y3,s,m3);mux_2to1 u2(x2,y2,s,m2);mux_2to1 u1(x1,y1,s,m1);mux_2to1

46、 u0(x0,y0,s,m0);endmodule /2to1 multiplexermodule mux_2to1(a,b,s,m);input a,b,s;output m;assign m=s?b:a;endmodule /circuit Bmodule circuit_B(z,seg);input z;output 0:6seg;assign seg6=1;assign seg5=z;assign seg4=z;assign seg3=z;assign seg2=0;assign seg1=0;assign seg0=z;endmodule /7-segment decodermodu

47、le btd(s,seg);input 3:0s;output 0:6seg;assign seg6=s3&s2&s1|s2&s1&s0;assign seg5=s3&s2&s0|s2&s1|s1&s0;assign seg4=s0|s2&s1;assign seg3=s3&s2&s1&s0|s2&s1&s0|s2&s1&s0;assign seg2=s2&s1&s0;assign seg1=s2&s1&s0|s2&s1&

48、;s0;assign seg0=s2&s1&s0|s3&s2&s1&s0;endmodule /4-bit full addermodule fa_4b(a,b,s,cin,cout);input 3:0a,b;input cin;output 3:0s;output cout;wire 3:1c;fadder fao(cin,a0,b0,s0,c1);fadder fa1(c1,a1,b1,s1,c2);fadder fa2(c2,a2,b2,s2,c3);fadder fa3(c3,a3,b3,s3,cout);endmodule/full adde

49、rmodule fadder(ci,a,b,s,co);input ci,a,b;output s,co;assign s=ciab,co=(ab)?ci:b;endmodule /circuit comparatormodule comparator(v,z);input 3:0v;output z;assign z=(v3&v2)|(v3&v1);endmodule / top-level filemodule bcd_adder(SW,LEDR,LEDG,LEDG8,HEX6,HEX4,HEX1,HEX0);input 8:0SW; /Cin,A,Boutput 8:0L

50、EDR;output 4:0LEDG;output 0:6HEX6,HEX4,HEX1,HEX0;output LEDG8;wire 3:0sum; /sumwire co; /coutwire 3:0ao; /circuit_A outputwire 3:0m; /mux2to1_4b outputwire z; /comparator outputwire bi; /circuit_B inputwire va,vb; /A,B comparator outputassign LEDR=SW,LEDG4=co,LEDG3:0=sum,LEDG8=va|vb;assign bi=co|z;

51、fa_4b u0(SW7:4,SW3:0,sum,SW8,co);circuit_A u1(sum,ao);comparator u7(sum,z);mux2to1_4b u2(sum,ao,bi,m);btd u3(m,HEX0);circuit_B u4(bi,HEX1);btd u5(SW7:4,HEX6);btd u6(SW3:0,HEX4);comparator u8(SW7:4,va),u9(SW3:0,vb);endmodule8.5.3 进一步扩展与提高根据上面的实验,设计一个2位BCD加法器。输入为两个2位BCD码加数A和B,低位进位端carry-in,输出为两个加数的和(用

52、三位BCD码表示)S2S1S0,注意处理和的最大值:S2S1S0=99+99+1=199。8.6触发器和锁存器8.6.1 设计内容本实验学习触发器的原理及其功能与应用。触发器(Flip Flop,简写为FF)是具有记忆功能的单元电路,由门电路构成,专门用来接收存储输出0、1代码。 它有双稳态、 单稳态和无稳态触发器(多谐振荡器)等几种。它有两个稳定状态,“0”和“1”。在输入信号作用下,两个稳态可相互转换。8.6.2 软件设计1)RS锁存器图8.11描述了门控RS锁存器电路,可用门级电路或表达式来描述。图8.11 门控锁存器电路图触发器有两个稳定状态。Qn为触发器的原状态(现态),即触发信号输入前的状态; Qn+1为触发器的新状态(次态),即触发信号输入后的状态。其功能表见表8.3:ClkRSQn+1功能100

温馨提示

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

评论

0/150

提交评论