ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:1.15MB ,
资源ID:19368006      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19368006.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第6章 基于EDA的组合电路设计综合及验证69综合性实例Word下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第6章 基于EDA的组合电路设计综合及验证69综合性实例Word下载.docx

1、(2) “-DataIn”操作可“把DataIn的8位数据包括符号位在内的所有位取反再加1”,该操作比较难以理解:在执行“-DataIn”操作时,仿真器会把DataIn中的数据当成补码来处理,如DataIn中存放的是“11110100”,那么仿真器会认为该数是-12的补码,因此“-DataIn”操作会得到值12,即“00001100”,就是“11110100”所有位取反再加1的结果。(3) “-DataIn”得到的是包括符号位在内所有位取反再加1的结果,因此再加上S(8b10000000)就可把最高位(符号位)从0变为1,最终得到补码结果。3综合结果4测试平台设计timescale 1ns/1

2、0ps module testbench; reg 7:0 dataIn;wire 7:0 dataOut;Com_2C Com_2C_1(.DataOut(dataOut),.DataIn(dataIn);initial dataIn=8b00011001; #20;b10110011;b11110100;b01110000;b10011100;b10000011;5功能验证6.9.2 实例二:有符号数的比较电路设计在本例中,通过Libero IDE中内嵌的比较器(Comparator)IP核,构造8位的有符号数据比较器。需要注意的是,当直接利用Libero IDE工具提供的比较器IP核进行

3、设计与仿真时,工具自动将输入的信号“理解”为补码形式(或者说工具要求用户输入的数据为补码),所以读者在设计时应当理清输入信号是否已经转换成为补码,如果是,直接利用工具提供的相应IP核即可,如果不是,则需要进行相应的转换。特别地,如果比较器模块是用户自行编程实现的,就要注意有符号数的比较与无符号数的比较有差别!2SmartDesign设计与连线在SmartDesign中,进行以下操作:(1) 用IP核Comparator创建一个8位的有符号比较器(比较“=”)。(2) 调入6.9.1节中的“Com_2C”模块,生成两个8位补码转换模块。(3) 进行连线操作。(4) 生成设计。连接结果如图所示。3

4、测试方法1可以用以下的测试平台(并不是最佳)进行测试,仿真也会正常运行并给出结果。module tb_cmp; reg 7:0 ina,inb; wire AGEB; sign_cmp sign_cmp_1(.DataA(ina) , .DataB(inb), .AGEB(AGEB); / sign_cmp为画布设计名称 initial ina=0; repeat(20) #20 ina =$random; inb=0; repeat(10) #40 inb =$random; initial #400 $finish;但该测试平台的设计可能会引起误会,因为通过随机函数生成的数据是以补码形式存

5、放的,而在此又当作原码数据进行处理。例如ina产生了随机数-12(十进制),则存放到ina中的数据为11110100(-12的补码),而设计中会当作-116(-116的原码是11110100)来进行对比。如果读者理解正确、思路清晰,倒也能达到测试目的。4测试方法2可以用以下的测试平台,直接指定输入的原码数据,不容易产生误会。 ina=8 / 原码数据输入#10; inb=8b11011001;#20; inb=8b00110100;b01111110;b01011100;功能仿真结果如图所示。在查看仿真结果时,需清楚ina和inb是原码而不是补码数据,故不能设置显示为别的数制格式(仿真软件会当

6、做补码处理)。5综合结果6.9.3 实例三:有符号数的加法电路设计2.3.5节中讨论了有符号二进制数加法器的多种实现方法,在此则采用“饱和法”来实现。第二章中的图2-45:对图2-45稍作修改,可得下图。虚线框选部分为一个4位串行进位加法器,而这部分其实可以用超前进位加法器替代。不管用串行进位还是超前进位加法器,只需该加法器输出C3和C2即可。在此通过SmartDesign软件,采用6.6.5节中设计的4位超前进位加法器模块(Add_prop_gen模块),按图进行连接,实现有符号4位二进制数的加法电路。(1) 添加6.6.5节中的Add_prop_gen模块到设计中,将Shiftedcarr

7、y2:0这3个端口标记为不使用(Mark Unused)。(2) 添加XOR2(异或)和INV(反向)宏单元到设计中。(3) 添加基本块“Multiplexor”(选择器),设置位宽为1,输入端口2个,并实例化4个选择器到设计中。(4) 进行连线操作。(5) 保存画布(命名为“adder4_of”),生成设计。连线结果如图所示。module testbench1; reg 3: reg cin; wire s3, s2, s1, s0, cout; adder4_of testadder (.A(ina), .B(inb), .C_in(cin), .S3(s3), .S2(s2), .S1(

8、s1), .S0(s0), .C_out(cout); begin cin=0; #200 cin =1; end 仿真结果如图所示。4测试方法2(改进)测试方法1的仿真结果看起来并不直观,可将测试平台修改为:module testbench2; wire 3:0 sum; assign sum=s3,s2,s1,s0; / 将4位输出合并为一个变量,方便显示 adder4_of testadder(.A(ina),.B(inb),.C_in(cin), .S3(s3),.S2(s2),.S1(s1),.S0(s0),.C_out(cout);在仿真波形窗口中进行以下操作:(1) 将cout、

9、s3、s2、s1、s0从显示结果中去掉,只留下ina、inb、cin、sum变量的显示。(2) 将ina、inb、sum变量设置为有符号十进制显示。(3) 在“sim”小窗口中,选择“testbench2”模块下的“testadder”实例,在“Objects”小窗口中选择“XOR2_0_Y”(该项为溢出标记),将其添加到波形显示中。(4) 清空结果并重新运行(选择“Restart”后选择“Run-All”),得到运行结果。从波形中可看出,当运算结果超出-8,+7范围后,溢出标记“XOR2_0_Y”显示为1,而结果只保留-8或+7(饱和处理结果)。6.9.4 实例四:八位二进制数转换为十进制数

10、的电路设计1设计方法1(课本里的)module BIN_to_BCD(Data,Units,Tens,Hundreds); input7:0 Data; / 二进制输入数据 output3:0 Units,Tens,Hundreds; reg3:0 units_r,tens_r,hundreds_r; / BCD数据输出寄存器0 dat_r; reg11:0 temp; / 临时寄存器 integer i; assign Units = units_r; assign Tens = tens_r; assign Hundreds = hundreds_r; always (Data) dat_

11、r = Data; temp = 0; for(i = 0;i 4d4) / 大于4,加三 temp3:0 = temp3:0 + 4d3; if(temp7:4 temp7:4 = temp7:4 + 4 if(temp11:8 temp11:8 = temp11:8 + 4 dat_r=dat_r1; / 最高变为原来dat_r的第六位 hundreds_r, tens_r, units_r=temp10:0, Data0; / 最后一次(第8次)不用修正测试平台设计如下:timescale 1ns/1ns0 data; wire3:0 units,tens,hundreds; wire1

12、1:0 bcd; BIN_to_BCD tb(.Data(data),.Units(units),.Tens(tens),.Hundreds(hundreds); assign bcd = hundreds*100 + tens*10 + units; / 处理为十进制数,更好地显示效果 data=8h00; #50 data=8h37; / 2位十六进制数,即8位二进制数输入hfe;h78;仿真结果如下。在波形窗口中,设置data为十六进制显示,设置bcd为无符号十进制显示。2设计方法2方法1是自己编写代码描述转换的具体过程,其实可以直接用常规的行为风格描述设计:module BIN_to_

13、BCD_2(Data,Units,Tens,Hundreds);input7:output3:0 Units;0 Tens;0 Hundreds;reg3:reg7:always (Data) Hundreds=dat_r/100; Tens=(dat_r-Hundreds*100)/10; Units=dat_r%10;方法2的测试平台、综合结果和仿真结果同方法1。6.9.5 实例五:编码器扩展电路设计1设计要求模拟的实际运行效果: 当按下09的按键后,(7段)数码显示器显示相应数字。 当按下大于9的按键后,数码显示器不显示数字。 若同时按下几个按键,优先级别的顺序是9到0。设计仿真要求:

14、有16个输入(位),每一位代表一个数字被按下(有信号输入)。 输出为8位的向量,输出显示译码结果。如Seg7:0从高位到低位表示“g、f、e、d、c、b、a”。2设计方法1通过现有芯片实现的设计思路:(1) 将16位输入信号进行编码(由2个74HC148及相关器件构建16-4线编码器)。(2) 将编码结果跟9进行比较(74HC85)。(3) 符合条件的进行译码显示(74HC4511)。以下利用Libero SmartDesign图形化设计工具,采用图文混合设计方法,综合编码器、比较器、显示译码器及门电路进行设计。按照如图所示的电路组装16-4编码器,该编码器原理同图2-12,但按照6.2.4的

15、74HC148模块的电平特性进行定义。注意该设计输入以低电平为有效,而输出A3、A2、A1、A0以高电平为有效(因为后续的模块以高电平为有效信号)。设计过程如下:(1) 导入设计文件。新建工程“extend_coder”,导入前面已经设计好的Verilog HDL模块文件,包括编码器(74HC148.v)、比较器(74HC85.v)、显示译码器(74HC4511.v)等模块文件。(2) SmartDesign设计与连线。在SmartDesign中进行以下操作: 建立名为“extend_coder”的设计文件,并将其设为根文件。 例化2个encoder8_3_1(HC148)模块、1个HC85模

16、块、1个HC4511模块至画布中。 从宏单元(Actel Macros)中例化3个二输入与门到画布中,将3个与门的输出Y都作反向(Invert)处理。 进行16-4线编码器的扩展:按照图6-41,分别将HC148_1(高位)及HC148_0(低位)的输入信号连至顶层;将HC148_1的GS输出端、HC148_0的EO和GS输出端标记为不使用;将HC148_1及HC148_0的Dataout2:0分别连至三个与门的输入端;另外将HC148_1的输出EO连至HC148_0的EI输入端。 设置HC85_0模块:将16-4线编码器的对应输出接入HC85_0模块,设置B3、B1、IAEB端口接入高电平(

17、Tie High);设置B2、B0、IAGB、IASB接入低电平(Tie Low);QAGB、QAEB设置为不使用。 设置HC4511_0模块:将16-4线编码器的对应输出接入HC4511_0模块;将HC85_0的QASB输出接入HC4511_0模块的BI_N端口;设置LT_N接入高电平、LE端口接入低电平;将Seg7:0连接到顶层(即LED数码管输出驱动信号)。 进行规则检查并生成设计。设计说明: 注意,HC148以低电平为1,而HC85和HC4511以高电平为1。 HC85的接线表示判断输入数据是否比10小(输出QASB)。 HC85的QASB连接HC4511的BI_N端口,表示输入数据大

18、于10的话,就清空输出结果。(3) 编写测试平台。测试平台的设计如下:0 datain,datain_0; reg ei; reg15:0 in,invec; wire 7:0 seg; extend_coder testcoder(.DataIn(datain),.DataIn_0(datain_0),.EI(ei),.Seg(seg); i=0; in=16b0000000000000001; repeat(17) invec=in; / 148芯片中,输入数据作了反向处理 datain,datain_0=invec; in=in(4) 功能仿真。datain为高位(158)数据,data

19、in_0为低位(70)数据。仿真开始,当datain为11111111,datain_0为11111110时,即输入invec=111111*0,表示第0位有信号输入(注意148是反向处理的),因此输出结果为seg=3f(即显示0,查看4511设计文件)。查看完整波形信号:发现在最后输入数据变为1111111111111111(16位),即表示什么输入都没有的时候,输出显示又会变回3f(即显示0),那是因为该电路结构只判断了大于9后清除显示,而没有处理当没有输入时的显示内容。不按键时显示0,在实际要求中也是可以接受的。如果不符合要求,则可以把目前的比较条件从“Ab1010”改为“(Ab1010

20、)&(A=0)”,相应需增加一个比较器和与门,布线也需进行修改。具体操作请读者自行进行。(5) 综合3设计方法2设计方法1是通过HC148进行连接的,由于HC148芯片对输入输出信号进行了反向处理,因此加大了理解的难度。如果使用没有进行反向处理的8-3编码器,也可以对设计进行修改。如已有编码器代码如下:/ encoder8_3.vmodule encoder8_3_1(DataIn, EO, Dataout, EI, GS); input EI; output EO, GS; output 2:0 Dataout; reg 2: reg EO, GS; integer I; always (D

21、ataIn or EI) begin:local if(EI) Dataout=0; EO=1; GS=1; else if(DataIn=0) EO=0; for (I = 0 ; I 8 ; I = I + 1) if (DataIn I) Dataout= I; GS=0;该代码与HC148的结构与思路相同,只是(输入/输出信号的)高低电平代表含义不同,Datain和Dataout中高电平表示1,EI、EO、GS的含义和规定同HC148芯片。由于该码器以高电平为1,因此不能使用设计方法1中的“与非”门,而改为“或”门。电路结构改造为如图所示的设计。测试平台也只是与设计方法1的稍有不同:module testbench_extend_coder_2;reg ei;reg15:0 invec;extend_coder_2 tb(.DataIn(datain),.DataIn_0(datain_0),.EI(ei),.Seg(seg);/ 设计名称为extend_coder_2 ei=0; invec=16b000000000000001; #20 invec=invec4设计方法3设计方法1和2是通过现有模块组装成新的设计,因此设计思路和连接方法与通过相应实际芯片实现物理上的连接一样。如果要在FPGA上实现,其实可以直接写出设计代码。module coder0_

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1