可编程逻辑电路设计实验.doc_第1页
可编程逻辑电路设计实验.doc_第2页
可编程逻辑电路设计实验.doc_第3页
可编程逻辑电路设计实验.doc_第4页
可编程逻辑电路设计实验.doc_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

可编程逻辑设计实验报告教学院专业班级学号姓名50目录实验一 LPM环境熟悉内容2实验二 CPLD的ROM/RAM使用6实验三 CPLD的FLASH MEMORY使用9实验四 CYCLONE II系列FPGA内部存储器应用12实验五 FPGA内部乘法器的应用15实验六 stratix内部结构及移位寄存器设计18实验七 FPGA内部RAM应用异步FIFO设计21实验八 FPGA的锁相设计25实验九 FPGA中数字信号处理模块应用29实验十 ALU设计34实验十二 乘法器的FPGA设计41实验十三 FFT的FPGA设计47实验一 LPM环境熟悉内容实验目的1、学会使用LPM参数化模块库进行系统设计。2、学会器件选择及器件的引脚分配3、了解所选器件的逻辑单元结构实验原理1、用LPM参数模块化设计方法设计一个16位的加减可控计数器2、选择合适器件,并进行引脚分配3、查看器件内部资源使用情况,并对引脚重新进行合理分配实验步骤1、打开QuartusII,新建一个工程addsub163、打开symbol tool,选择megafunctions/arichmetic下的lpm_counter,点击OK, 修改该宏函数输出的形式及存放目录和名称4、选择器件,输入数据位数和实现的功能,选择器件的计数使能5.选择清零端口,可加上输入输出端口6.选择具体器件,进行引脚分配(如果引脚自动分配,可直接进行综合编译)7.查看器件内部逻辑单元使用情况,内部资源调整8.内部资源调整后重新综合9.功能仿真达到预期结果实验二 CPLD的ROM/RAM使用实验目的1、 学会使用LPM参数化模块库进行CPLD的ROM设计。2、 学会使用LPM参数化模块库进行CPLD的RAM设计。3、 学会用QuartusII进行波形仿真,验证设计的ROM/RAM是不是正确。4、 了解所选器件的逻辑单元结构实验原理以用LPM参数化模块库设计一个16k的RAM为例,选择器件为EPF10K20TC144-3。1、打开QuartusII,新建一个工程RAM16k。2、新建一个图形输入文件.bdf3、打开symbol tool,选择megafunctions/storage下的lpm_ram_dp,点击OK或者点击MegaWizard Plug_in Manager实验步骤1、该宏函数输出的形式及存放目录和名称2、选择器件及RAM的容量(输出数据宽度和地址宽度,MAX系列只有RAM),cyclone和stratix系列可以是单时钟3、选择输入输出端口(如果输出端口不选择,则只需要一个时钟信号,即输出是组合电路输出)。4、完成设计,点击ok5、加入输入输出引脚6、保存.bdf文件(注意文件名不能跟创建的ram文件名一致),建立波形文件,进行仿真。(1)图为将数据存入相应的地址单元,使能信号为1时可以写入数据。(2)图为将数据从相应的地址单元取出,使能信号为0时可以读出数据。实验三 CPLD的FLASH MEMORY使用实验目的1、学会使用LPM参数化模块库进行MAXII系列的FLASH MEMORY设计。2、学会使用LPM参数化模块库进行CYCLONEII系列的RAM设计。3、学会用QuartusII进行波形仿真,验证设计的ROM/RAM/FLASH MEMORY是不是正确。4、了解所选器件的逻辑单元结构。实验原理以用LPM参数化模块库设计一个FLASH,选择器件为flash memory。1、打开QuartusII,新建一个工程flash。2、新建一个图形输入文件.bdf3、打开symbol tool,选择点击MegaWizard Plug_in Manager4、选择好器件进入到如下图,选择串行总线,MAX II实验步骤1、在选择器件之前先建一个.mif的文件,填充好数据,在接下来的器件生成的过程中直接选择加载该文件2、在将器件建好之后,进行综合时会有错误,这是应该打开软件上方的assignments里的device然后选择MAX II,完成后综合就不会出现错误7、建立仿真波形文件8、画出波形进行仿真,与实现建好的.mif文件的数字进行对照,以验证仿真的正确性9、对器件引脚的介绍addr8.0引脚为9位地址端口di15.0为16位数据输入端口nread为读端口,低电平有效nwrite为写端口,低电平有效nerase为数据擦除端口,低电平有效do15.0为16位数据输出端口10、ISP与IIC总线SPI是一种高速、全双工、同步通信总线,传输的数据位为8位,传输时高位在前,地位在后。IIC总线每一位数据位的传输都与时钟脉冲相对应,逻辑“0”和逻辑“1”的信号电平取决于相应的电源电压Vcc。数据传输时,SCL为高电平期间,SDA上的数据必须保持稳定,在SCL为低电平期间,SDA上的电平状态才允许变化。实验四 CYCLONE II系列FPGA内部存储器应用实验目的1、学会使用LPM参数化模块库进行CPLD的ROM设计。2、应用CYCLONE II系列进行ROM/RAM设计。3查看cyclone的使用手册,了解cycloneII系列的配置。实验原理参考实验一和实验二的实验原理。实验内容1、查看cyclone的使用手册,了解cycloneII系列的配置2、设计一个频率固定的正弦函数信号发生器。(1)利用LPM或编写VHDL/VerilogHDL程序,设计一个计数器。(2)设计一个.mif文件,存放正弦函数的离散数据(3)利用LPM设计一个ROM(4)将计数器的输出作为ROM的地址输入端,取出ROM中存放的正弦函数数据3、设计一个频率可选的正弦函数发生器在实验内容2的基础上,思考如何产生一个频率可选的正弦函数信号发生器(例如可产生3种频率的正弦信号函数发生器),并设计之。4、 进一步思考产生任意频率的正弦函数信号发生器。实验步骤打开symbol tool,选择megafunctions/storage下的lpm_rom,点击OK或者点击MegaWizard Plug_in Manager,该宏函数输出的形式及存放目录和名称(计数器的设计)该宏函数输出的形式及存放目录和名称:选择进位输出该宏函数输出的形式及存放目录和名称(ROM存储器的设计),该宏函数输出的形式及存放目录和名称:添加.mif文件设计总原理图:设计仿真波形:结论:由仿真波形与事先编辑好的.mif的文件可知,实验结果如预期设计的正弦波发生原理相符。CycloneII系列的三种配置方式说明:1、 只有EPCS16和EPCS64器件需要DCLK达到40MHz的时钟,其余的EPCS只需要DCLK达到20MHz。具体的选型可参考serial configuration devices data sheet2、 JTAG配置的优先权高于其他的配置方式。这就意味着MSEL引脚的设置可忽略。3、 不可让MSEL引脚悬空,将他们连到VCCIO或GND,这些引脚在做成产品后支持非JTAG配置方式。如果只使用JTAG配置,可将MSEL引脚都连到GND。实验五 FPGA内部乘法器的应用实验目的1、学会使用LPM参数化模块库进行乘法器设计。2、分别用clyclone系列和stratix系列设计乘法器,并查看设计电路的RTL级,了解两种器件的嵌入乘法器有什么不一样。实验原理1、LPM参数化设计方法跟前面实验是一样的。2、查看RTL级步骤如下: Tools下的netlist viewer/rtl viewer CycloneII的9位乘法器的RTL结构 stratix的9位乘法器的RTL结构实验步骤用LPM参数化模块库设计一个20位的乘法器。(1)分别用cyclone系列器件和stratix系列设计无符号位的20位乘法器。打开symbol tool,选择megafunctions/storage下的lpm_rom,点击OK或者点击MegaWizard Plug_in Manager该宏函数输出的形式及存放目录和名称选择器件及mult的数据宽度LPM_MULT 不需要流水线操作。加入输入输出引脚保存.bdf文件(注意文件名不能跟创建的rom文件名一致),建立波形文件,进行仿真(2)查看两种器件设计时的complication report,比较它们各种占用器件内部资源情况。Cyclone II系列与StratixII系列(3)查看两种器件设计的乘法器的RTL级,比较存在着什么地方不同,深入了解两种器件的嵌入乘法器有什么不同?Cyclone II系列与stratixII系列分析:Cyclone II系列器件生成的乘法器在寄存器传输级是通过数据选择实现最终的乘法运算的,stratixII系列器件生成的乘法器在寄存器传输级是通过加法器实现最终的乘法运算的。(3)分别用cyclone系列器件和stratix系列设计有符号位的20位乘法器,查看两种器件设计时的complication report,比较它们各种占用器件内部资源情况。查看两种器件设计的乘法器的RTL级,比较存在着什么地方不同,深入了解两种器件的嵌入乘法器有什么不同?Cyclone II系列与StratixII系列分析:Cyclone II系列与stratixII系列生成的器件都占用了80引脚资源,cycloneII系列占用逻辑单元为48个,而stratixII系列使用的是DSP块9位的单元(集合型的逻辑单元)占用了8个。实验六 stratix内部结构及移位寄存器设计实验目的1、学会使用LPM参数化模块库进行移位寄存器设计。2、熟悉stratix内部结构,了解其内部嵌入模块的功能。实验原理1、LPM参数化设计方法跟前面实验是一样的。2、利用cyclone系列或stratix系列的嵌入RAM可设计移位寄存器3、利用LPM的storage可以设计移位寄存器。实验内容1、用LPM参数化模块库设计一个128位的移位寄存器。实验步骤(1)利用cyclone系列或stratix系列的嵌入RAM可设计移位寄存器。一、原理图生成1、使用shiftregister(RAM-based)进行移位寄存器的设计,选择移位寄存器的16位输出和存储模块容量大小2、生成移位寄存器器件加入输入输出引脚,建立波形文件二、波形仿真验证寄存器设计的正确性1、在波形图中输入时钟与移位数据2、波形仿真结果由仿真结果知,寄存器的仿真符合预期理论结果。(2)利用LPM的storage可以设计移位寄存器。1、使用LPM_SHIFTREG进行移位寄存器的设计,选择移位寄存器的128位左移输出2、移位寄存器的清零、置位选择,生成移位寄存器器件加入输入输出引脚二、波形仿真验证寄存器设计的正确性1、建立波形文件,在波形图中输入时钟与移位数据3、波形仿真结果由仿真结果知,寄存器的仿真符合预期理论结果。(3)对上述设计的移位寄存器进行波形仿真,比较异同。比较:由设计到仿真的流程与结果知,利用cyclone系列或stratix系列的嵌入RAM设计移位寄存器能够选择输入数据的位数,不能选择移位方向,且利用存储器进行移位结果不能立即输出,需要全部16个时钟周期之后才可以输出,而利用LPM的storage设计移位寄存器,是随着时钟一位,一位移动,其结果是立即输出的(即移位完成立即输出)。实验七 FPGA内部RAM应用异步FIFO设计实验目的1、学会使用LPM参数化模块库进行FIFO设计。2、熟悉FIFO的工作原理。实验原理1、异步FIFO工作原理及结构在现代的集成电路中,一个系统往往含有数个时钟,多个时钟带来的问题就是如何设计异步时钟之间的接口电路。要使数据在两个时钟域之间稳定有效地传输,必须把前一个时钟的输出数据经过处理,使之同步于下一个时钟域的时钟,实际上就是一个数据接口的同步问题。异步FIFO(first in first out,先入先出)是解决接口同步问题的一种简便、快捷的方案。异步FIFO是一种特殊功能的存储器,起到存储缓冲数据的作用,它是以FIFO的方式存储数据的。数据以到达FIFO输入端口的先后顺序依次存储在存储器中,并以相同的顺序从FIFO的输出端送出。因此,FIFO内数据的写入和读出只受读/写时钟和读/写请求信号的控制,而不需要读/写地址线。 图1 异步FIFO的结构框图上图为异步FIFO的结构框图,整个系统分为两个完全独立的时钟域读时钟域和写时钟域。FIFO的存储介质为一块双端口的RAM,可以同时进行读写操作。在写时钟域部分,由写地址产生模块产生写地址;读时钟部分由读地址产生模块产生读地址。在空/满标志产生部分,由读、写地址相互比较产生空/满标志,以此来控制数据的收发,使数据部丢失。也就是说读、写地址是由异步FIFO内部逻辑产生的,外部电路只要给出读、写时钟及读、写请求信号,FIFO就能工作,起到缓冲数据作用。2、异步FIFO的实现方法 设计异步FIFO有两种方法,一种是自己用VHDL或VerilogHDL进行逻辑设计,编写FIFO模块,这是可以实现的,但是在异步电路中,由于时钟之间周期和相位完全独立,因而数据的丢失概率不为零,设计一个高可靠性、高速的异步FIFO电路非常困难,既要防止亚稳态的影响,又要考虑如何产生读、写地址及空/满标志控制电路,所以模块特别是可综合模块编写起来,将会花费大量的时间和精力。 另一种方法就是调用参数化模块来实现,就是采用LPM参数化模块进行设计。实验步骤一、用LPM参数化模块库设计一个64*8的异步FIFO。1、设计步骤(1)利用stratix系列的一个128*8的异步FIFO。(2)选择所设计的器件的参数,8位16字,读写时钟相同. (3)选择自动优化(4)器件生成的原理图2、实验仿真(1)仿真波形的建立(2)器件的仿真结果分析:有仿真图可知,该先进先出的缓冲器,与编程语言中的栈相似,先写入的数据,先被读出来,经仿真分析可知,该器件设计正确。二、设计一个双时钟FIFO器件1、设计步骤(1)利用stratix系列的一个128*8的异步FIFO。(2)选择所设计的器件的参数,8位16字,读写时钟分成两个。(3)选择参数读空、写满。(4)选择自动优化2、设计原理图3、实验结果仿真(1)仿真波形的设计(2)实验仿真结果分析:由仿真图可知,该先进先出缓冲器由写时钟、读时钟构成,可同时进行读写操作,当存储器内没有数据时,进行读写时,读空数据线置高电平,说明这一时间存储器内无数据,当数据写入存储器时,则在之后的数据读时,可以将数据读出,并且是先进先出的形式,说明该器件设计功能正确。实验八 FPGA的锁相设计实验目的1、 学会使用LPM参数化模块库进行锁相环设计。2、 熟悉锁相环的工作原理。3、 掌握锁相环的应用。实验原理Cyclone 等系列的 FPGA中含有高性能的嵌入式模拟锁相环 (性能远优于数字锁相环),此锁相环 PLL 可以与一输入的时钟信号同步,并以其作为参考信号实现锁相,从而输出一至多个同步倍频或分频的片内时钟,以供逻辑系统应用。与直接来自外部的时钟相比,这种片内时钟可以减少时钟延时和时钟变形,减少片外干扰;还可以改善时钟的建立时间和保持时间。Cyclone 系列和 Stratix 系列器件中的锁相环能对输入的参考时钟相对于某一输出时钟同步独立乘以或除以一个因子,并提供任意相移和输出信号占空比。下图为cyclone系列的锁相环原理图。每个PLL有一个预分频系数(N)和一个乘法系数(M),范围从1到32。输入时钟(fIN)经由预分频计数器(N)分频后产生PFD的输入参考时钟(fREF)。然后fREF乘以M反馈系数。控制环路驱动VCO频率匹配fIN(M/N)。fREF=fIN/NfVCO=fREFMfIN(M/N)每个输出端口有一个唯一的后分频计数器降低高频VCO。有三个后scale计数器(G0、G1和E),范围从1至32。fC0=fVCO/G0=fIN(M/(NG0) fC1=fVCO/G0=fIN(M/(NG1) fC0=fVCO/E=fIN(M/(NE)Altera公司的Stratix II等系列的FPGA提供了可重配置的PLL,从而可以实时地对PLL进行重新配置,使其适应新的工作要求。通过Altera的Quartus II软件可以生成一个可重配置的PLL。 建立片内 PLL 模块的步骤如下: (1)在Tools 菜单中选择 MegaWizard Plug-In Manager, 对弹出的界面选择 Create a new custom项,定制一个新的模块,选择 I/O 项下的 ALTPLL,再选 Cyclone 器件和输出语言方式,最后输入设计文件存放的路径和文件名,如d:sin_gntPLL3.vhd。单击 Next 按钮后弹出图 8-1 所示的窗口。 图8-1选择参考时钟为16MHz(2)在图8-1 所示窗口中首先设置参考时钟频率 inclk0 为 16MHz,注意,这个时钟频率不能低于 15MHz。然后单击 Next 按钮,接着在图8-2 所示的窗口中选择锁相环的工作模式(选择内部反馈通道的通用模式) 。单击 Next 按钮后即进入图 7-30 所示的窗口。在此窗口主要选择 PLL 的控制信号,如PLL的使能控制 pllena;异步复位areset;锁相输出locked 等。单击 Next 按钮进入图所示8-3的窗口。 图8-2选择控制信号图8-3选择c0的片内时钟倍频为2(3)图 8-3 所示的窗口中选中 Use this c1,即选择另一输出时钟端 c1。并选择第一个输出时钟信号 c0 相对于输入时钟的倍频因子是 2,即 c0 的片内输出频率是 32MHz;时钟相移和时钟占空比不变,保持原来默认的数据。(4)此后分别在出现的对话框中选中的 c1 和 e0 的时钟设置倍频因子为 4 和 8。时钟相移和时钟占空比也不变。最后完成了文件 pll3.vhd 的建立。在设置参数的过程中必须注意密切关注编辑窗右框上的一句提示:“Able to implement” ,此句表示所设参数可以接受,如出现“Can t”提示,表示不能接受所设参数,必须改设其他参数。实验步骤设计一个4倍频的倍频电路。(1)在Tools 菜单中选择 MegaWizard Plug-In Manager, 对弹出的界面选择 Create a new custom项,定制一个新的模块,选择 I/O 项下的 ALTPLL,再选 Cyclone 器件和输出语言方式,最后输入设计文件存放的路径和文件名,如d:sin_gntPLL3.vhd。单击 Next 按钮后弹出图 9-1 所示的窗口。图9-1选择参考时钟为100MHz(2)在图9-1 所示窗口中首先设置参考时钟频率 inclk0 为 16MHz,注意,这个时钟频率不能低于 15MHz。然后单击 Next 按钮,接着在图9-2 所示的窗口中选择锁相环的工作模式(选择内部反馈通道的通用模式) 。单击 Next 按钮后即进入图 7-30 所示的窗口。在此窗口主要选择 PLL 的控制信号,如PLL的使能控制 pllena;异步复位areset;锁相输出locked 等。单击 Next 按钮进入图所示9-3的窗口。图9-2选择控制信号图9-3选择c0的片内时钟倍频为4(3)图 9-3 所示的窗口中选中 Use this c0,即选择输出时钟端 c0。并选择第一个输出时钟信号 c0 相对于输入时钟的倍频因子是 4,即 c0 的片内输出频率是 400MHz;时钟相移和时钟占空比不变,保持原来默认的数据。(4)此后分别在出现的对话框中选中的 c0 的时钟设置倍频因子为 4时钟相移和时钟占空比也不变。最后完成了文件 PLL.v 的建立。在设置参数的过程中必须注意密切关注编辑窗右框上的一句提示:“Able to implement” ,此句表示所设参数可以接受,如出现“Can t”提示,表示不能接受所设参数,必须改设其他参数。(5)设计原理图(6)仿真结果分析:由仿真图可知,所设计的PLL锁相环进行的4倍频,输出频率为输入频率的4倍,说明所设计的器件可以实现4倍频功能。实验九 FPGA中数字信号处理模块应用实验目的1、 了解stratix系列的DSP模块的结构。2、 利用stratix系列的DSP模块设计乘法累加器。3、 选择宏模块存储的路径和文件名。实验过程1、 打开quartus II软件,点击图1软件图标。图12、 建立工程文件,工程名以名字的首字母命名,操作如图2、3所示。图2图33、新建原理图设计文件,操作如图4、5所示。图4图54、在原理图设计界面使用LPM设计方法,设计生成乘法累加器元件,如图6、7所示。图6图75、使用LPM参数设计方法生成乘法累加器元件,使用stratix系列的DSP模块、输出文件创建为Verilog HDL语言、器件名字命名为MAC,具体操作如下图8所示。图86、继上一步之后点击next可看到MAC器件,dataa、datab都选为8位无符号数据输入端口,用于进行乘法累加数据的输入,result为32位数据输出端口,用于输出乘法累加的结果,具体操作如图9、10所示。图9图107、继上一步之后,选择乘法累加器为只加、单时钟输入,具体操作如图11所示。图118、最后完成乘法累加器的设计,生成如图12所示的元件,两个16位数据输入端,一个时钟输出端,一个32位数据输出端。图129、配置元件端口,配置好元件端口之后保存并编译,具体操作如图13、14所示。图13图1411、编译通过之后建立波形仿真文件,添加时钟、输入输出端口,具体操作步骤如图16、17所示。图16图1712、输入数据进行波形仿真,时钟周期选择40ns,占空比为50%,个输入输出数据属性均调整为十进制无符号数,输入数据如图17所示。图17实验结果1、仿真结果如图18所示。图182、 针对仿真波形进行分析由图18的仿真结果可知,dataa输入为15、14、13、12、11、10 datab输入为15、14、13、12、11、10在经历2个时钟之后,从第3个时钟开始进行乘法累加计算并输出计算结果,此后每过一个时钟输出一个计算结果,直到数据计算完。即1515=225+1414=421+1313=590+1212=734+1111=855+1010=955经验证上式计算结果正确无误,乘法累加器设计完成符合我的设计要求。遇到的问题及解决方法1、 原理图设计完成时,编译之后出现错误。原因:当前原理图非工程中的最顶层文件。解决方法:将当前编译的原理图文件置顶,即可解决。2、 建立完波形仿真文件之后,点击仿真不能正常进行。原因:仿真波形文件未加载到当前工程。解决方法:点击quartus II软件顶部的assignments选项,再点击下拉菜单中的device选项,再点击simultlator srtting在simultlator input处将之前建好的仿真波形文件加载即可进行正常的波形仿真。实验十 ALU设计实验目的利用参数库LPM和原理图输入法设计一个算术运算单元ALU。本次用LPM设计8位数值比较器实验过程1、打开QuartusII,新建一个工程shiyan10。2、在Tools 菜单中选择 MegaWizard Plug-In Manager, 对弹出的界面选择 Create a new custom项,定制一个新的模块,选择 I/O 项下的 ALTPLL,3、再选 stratix 器件和输出语言方式最后输入设计文件存放的路径和文件名4、选择器件的数据位,和输出的的控制端口的类型,分别为等于、大于、小于。5、选择8位无符号的数据,数据总线的范围。6、比较器没有设计流水线。7、加入图形文件和输入和输出引脚名,并对引脚名进行修改,修改的引脚名为:dataa7.0、datab7.0输出引脚名:aeb,agb,albdataa7.0输入数据端口a datab7.0输入数据端口baeb输出端口为等于agb输出端口为大于alb输出端口为小于8、综合仿真的波形图。总结:在输入数据端口datab7.0a和输入数据端口datab7.0 b的输入数据时,输出端口就会比较输出。当20-420时,输出端口大于类型agb就会为1,其他比较类型为0;当30-30=0时,输出端口等于类型aeb为1,其他比较类型为0.实验十一 流水线设计方法实验目的进一步理解流水线设计方法,了解该设计方法的优点。实验原理为了提高多级逻辑的系统速度, 在FPGA的逻辑实现中, 同样可引入“流水线”的概念。 流水线设计的概念是把在一个时钟周期内执行的逻辑操作分成几步较小的操作, 并在多个较高速的时钟内完成。通俗的讲就是本来是一条龙服务的,现在将整个环节分割成几小段,然后让这几个分段同时开始各自的工作,最后将这些小段连接成整体,这样便提高了系统的运行速度,提高了效率。例如:1、切割流水线前的描述module add(a,b,s,cout);input31:0 a,b;output31:0 s;output cout; wire 31:0 a,b,s;wire cout;assign cout, s=a+b;endmodule一、 切割流水线后的描述 module ladder(a,b,s,cout); input31:0 a,b;output31:0 s;output cout;reg c1_d; wire 31:0 a,b;assign c1,s15:0=a15:0+b15:0; always(posedge clk or negedge nrst) if(nrst) c1_d=0; else c1_d = c1; assign cout, s31:16= a31:16+b31:16+c1_d;三、实验内容通过加入四级流水线,设计一个42位数据相加,是带符号位的,也就是符号数。可将42为数据分为3段11位相加和一段9位相加。值得注意的是前三段中相加时候要扩展一位进位,可以直接在数据前加一位0,但是在最后一段的相加中我们需要将最高的符号位扩展一次,以免加到溢出,同时可以保留符号结果。以下是部分verilog代码:module pipl_add(clk,rst, add_a,add_b, add_out);input clk;input rst;input41:0 add_a;input41:0 add_b;output42:0 add_out; /为保证不溢出,相加结果扩展一位;reg11:0 sum1;reg22:0 sum2;reg33:0 sum3;reg42:0 add_out;/中间寄存的数据reg8:0 add_tmpa3,add_tmpb3;reg19:0 add_tmpa2,add_tmpb2;reg30:0 add_tmpa1,add_tmpb1;always(posedge clk or negedge rst) beginif(!rst) sum1 = 0; else begin sum1 = 1b0,add_a10:0 + 1b0,add_b10:0; add_tmpa1 = add_a41:11; add_tmpb1 = add_b41:11; /储存未计算的数据 endend继续完成该程序,经程序补充完整。并进行综合,仿真。实验报告1、设计过程:第一步:先建立工程项目第二步:建立.V文件写入程序输入的程序:module pipl_add(clk,rst,add_a,add_b,add_out,en);input clk;input rst,en;input41:0 add_a;input41:0 add_b;output42:0 add_out; /为保证不溢出,相加结果扩展一位;reg11:0 sum1;reg22:0 sum2;reg33:0 sum3;reg42:0 add_out;/中间寄存的数据reg8:0 add_tmpa3,add_tmpb3;reg19:0 add_tmpa2,add_tmpb2;reg30:0 add_tmpa1,add_tmpb1;always(posedge clk or negedge rst) beginif(!rst) sum1 = 0; else if(en) beginsum1 = 1b0,add_a10:0 + 1b0,add_b10:0; add_tmpa1 = add_a41:11; add_tmpb1 = add_b41:11; /储存未计算的数据 endendalways(posedge clk or negedge rst)beginif(!rst) sum2 = 0; else if(en) beginsum2 = 1b0,add_a21:11 + 1b0,add_b21:11+sum111,sum110:0; add_tmpa2 = add_a41:22; add_tmpb2 = add_b41:22; /储存未计算的数据 endendalways(posedge clk or negedge rst)beginif(!rst) sum3 = 0; else if(en) beginsum3 = 1b0,add_a32:22 + 1b0,add_b32:22+sum222,sum221:0; add_tmpa3 = add_a41:33; add_tmpb3 = add_b41:33; /储存未计算的数据 endendalways(posedge clk or negedge rst)beginif(!rst) add_out = 0; else if(en) beginadd_out = 1b0,add_a41:33 + 1b0,add_b41:33+sum333,sum332:0; endendendmodule第三步:将输入完成的数据进行综合编译,建立仿真波形,得到仿真结果,对波形进行分析。2、对设计结果进行分析说明。分析:由仿真图可知,输入数据,经过四个时钟周期之后,输出相加结果,之后每个数据均在一个周期计算完成,形成流水线操作。该电路与纯组合电路相比较,在执行速度方面有绝对优势。该流水线操作方式适合数字信号处理。实验十二 乘法器的FPGA设计实验目的1、学习应用移位相加原理设计乘法器。2、学习用加法器树方法设计乘法器。3、学习用查表法设计乘法器。实验原理完整的移位相加乘法器设计原理: 乘法通过逐项移位相加来实现相乘。从被乘数的最低位开始,若为1,则乘数左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。从图1 的逻辑图及其乘法操作时序图图2(示例中的相乘数为9FH和FDH )上可以清楚地看出此乘法器的工作原理。为了更好了解其工作原理,图1 中没有加入控制电路。图1 中,START 信号的上跳沿及其高电平有两个功能,即16 位寄存器清零和被乘数A7.0向移位寄存器SREG8B加载;它的低电平则作为乘法使能信号。CLK 为乘法时钟信号。当被乘数被加载于8 位右移寄存器SREG8B后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。当为1 时,1 位乘法器ANDARITH打开,8 位乘数B7.0在同一节拍进入8 位加法器,与上一次锁存在16 位锁存器REG16B中的高8 位进行相加,其和在下一时钟节拍的上升沿被锁进此锁存器。而当被乘数的移出位为0时,与门全零输出。如此往复,直至8 个时钟脉冲后,最后乘积完整出现在REG16B端口。在这里,1 位乘法器ANDARITH的功能类似于1 个特殊的与门,即当ABIN 为1时,DOUT 直接输出DIN,而当ABIN 为0时,DOUT 输出全“00000000”。8 位移位相加原理构成的乘法器比用组合电路直接设计的同样功能的电路的资源(逻辑宏单元LCs)耗用要小许多,由编译报告可知,前者是52,后者是169。从波形图图9-35 可见,当9FH和FDH相乘时,第1 个时钟上升沿后,其移位相加的结果(在REG16B端口)是4F80H,第8 个时钟上升沿后,最终相乘结果是9D23H。图1 8位乘法器逻辑原理图图2 8位移位相加乘法器运算逻辑波形图加法器树方法和查表法设计设计乘法器请参考教材6.1节。实验内容1、采用移位相加原理设计8位乘法器,设计图1中各个模块,并采用原理图输入方式输入顶层模块。2、采用加法器树设计8位乘法器3、用查表法设计8位乘法器4、具体说明并比较这几种乘法器的逻辑资源占用情况和运行速度情况。实验报告1、编写程序,并通过波形仿真。实验步骤:通过8位右移寄存器、8位加法器、1位乘法器、16位锁存器/右移寄存器,四个模块程序来生成各个顶层模块,将顶层模块连接成顶层设计原理图。2、对设计结果进行分析说明。编译顶层程序通过之后,建立仿真波形。得出仿真结果:通过分析仿真波形知,乘法器在经过8个时钟之后输出正确结果,但在第8个时钟之前曾、输出是不确定的,可以将该乘法器改进,加入一个控制锁存的信号,只锁存正确的输出结果,达到输出结果更加直观精确的目的。附实验内容一程序,供参考:1、- 8位右移寄存器LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;ENTITY SREG8B ISPORT ( CLK, LOAD : IN STD_LOGIC;DIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0);QB : OUT STD_LOGIC );END SREG8B;ARCHITECTURE behav OF SREG8B ISSIGNAL REG8 : STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINPROCESS (CLK, LOAD)BEGINIF CLKEVENT AND CLK = 1 THENIF LOAD = 1 THEN REG8 = DIN;ELSE REG8(6 DOWNTO 0) = REG8(7 DOWNTO 1);END IF;END IF;END PROCESS;QB = REG8(0); - 输出最低位END behav;2、-8位加法器LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ADDER8B ISPORT ( CIN : IN STD_LOGIC;A , B : IN STD_LOGIC_VECTOR(7 DOWNTO 0);S : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);COUT : OUT STD_LOGIC );END ADDER8B;ARCHITECTURE behav OF ADDER8B ISSIGNAL SINT, AA,BB : STD_LOGIC_VECTOR(8 DOWNTO 0);BEGINAA=0&A; BB=0&B; SINT=AA+BB+CIN;S=SINT(7 DOWNTO 0); COUT=SINT(8);END behav;3、-1位乘法器LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;ENTITY ANDARITH IS - 选通与门模块PORT ( ABIN : IN STD_LOGIC;DIN : IN STD_LOGIC_VECTOR(7 DOWNTO 0);DOUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );END ANDARITH;ARCHITECTURE behav OF ANDARITH ISBEGINPROCESS(ABIN, DIN)BEGINFOR I IN 0 TO 7 LOOP - 循环,完成8位与1位运算DOUT(I) = DIN(I) AND ABIN;END LOOP;END PROCESS;END behav;4、-16位锁存器/右移寄存器LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY REG16B IS - 16位锁存器PORT (CLK, CLR : IN STD_LOGIC;D : IN STD_LOGIC_VECTOR(8 DOWNTO 0);Q : OUT STD_LOGIC_VECTOR(15 DOWNTO 0) );END REG16B;ARCHITECTURE behav OF REG16B ISSIGNAL R16S : STD_LOGIC_VECTOR(15 DOWNTO 0);BEGINPROCESS(CLK, CLR)BEGINIF CLR=1 THEN R16S=0000000000000000;-时钟到来时,锁存输入值,并右移低8位ELSIF CLKEVENT AND CLK=1 THENR16S(6 DOWNTO 0) =R16S(7 DOWNTO 1);-右移低8位R16S(15 DOWNTO 7) = D; - 将输入锁到高8位END IF;END PROCESS;Q = R16S;END behav;5 - 8位乘法器顶层设计LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;use ieee

温馨提示

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

评论

0/150

提交评论