




已阅读5页,还剩39页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
西安邮电学院计算机系,VerilogHDL模块设计实例,1.组合逻辑电路设计实例:例1八位带进位端的加法器的设计实例(利用简单的算法描述)moduleadder_8(cout,sum,a,b,cin);outputcout;output7:0sum;inputcin;input7:0a,b;assigncout,sum=a+b+cin;endmodule,例2指令译码电路的设计实例(利用电平敏感的always块来设计组合逻辑)/操作码的宏定义defineplus3d0defineminus3d1defineband3d2definebor3d3defineunegate3d4,modulealu(out,opcode,a,b);output7:0out;input2:0opcode;input7:0a,b;reg7:0out;always(opcodeoraorb)/用电平敏感的always块描述/组合逻辑begincase(opcode)/算术运算plus:out=a+b;,minus:out=a-b;/位运算band:out=aendcaseendendmodule,例3.利用task和电平敏感的always块设计比较后重组信号的组合逻辑.modulesort4(ra,rb,rc,rd,a,b,c,d);parametert=3;outputt:0ra,rb,rc,rd;inputt:0a,b,c,d;regt:0ra,rb,rc,rd;always(aorborcord)/用电平敏感的always块描述组合逻辑,beginregt:0va,vb,vc,vd;va,vb,vc,vd=a,b,c,d;sort2(va,vc);sort2(vb,vd);sort2(va,vb);sort2(vc,vd);sort2(vb,vc);ra,rb,rc,rd=va,vb,vc,vd;end,tasksort2;inoutt:0x,y;regt:0tmp;if(xy)begintmp=x;x=y;y=tmp;endendtaskendmodule,例4.比较器的设计实例(利用赋值语句设计组合逻辑)modulecompare(equal,a,b);parametersize=1;outputequal;inputsize-1:0a,b;assignequal=(a=b)?1:0;endmodule,例5.3-8译码器设计实例(利用赋值语句设计组合逻辑)moduledecoder(out,in);output7:0out;input2:0in;assignout=1b1in;/*把最低位的1左移in(根据从in口输入的值)位,并赋予out*/endmodule,例6.8-3编码器的设计实例编码器设计方案之一:moduleencoder1(out,in);output2:0out;input7:0in;reg2:0out;always(in)begin:localintegeri;out=0;,/*returnsthevalueofthehighestbitnumberturnedon*/for(i=0;i8;i=i+1)beginif(ini)beginout=i;endendendendmodule,编码器设计方案之二:moduleencoder2(none_on,out2,out1,out0,h,g,f,e,d,c,b,a);inputh,g,f,e,d,c,b,a;outputnone_on,out2,out1,out0;wire3:0outvec;assignoutvec=h?4b0111:g?4b0110:f?4b0101:e?4b0100:d?4b0011:c?4b0010:b?4b0001:a?4b0000:4b1000;assignnone_on=outvec3;assignout2=outvec2;assignout1=outvec1;assignout0=outvec0;endmodule,编码器设计方案之三:moduleencoder3(none_on,out2,out1,out0,h,g,f,e,d,c,b,a);inputh,g,f,e,d,c,b,a;outputout2,out1,out0;outputnone_on;reg3:0outvec;assignnone_on,out2,out1,out0=outvec;,always(aorborcordoreorforgorh)beginif(h)outvec=4b0111;elseif(g)outvec=4b0110;elseif(f)outvec=4b0101;elseif(e)outvec=4b0100;elseif(d)outvec=4b0011;elseif(c)outvec=4b0010;elseif(b)outvec=4b0001;elseif(a)outvec=4b0000;elseoutvec=4b1000;endendmodule,例7.多路器的设计实例。使用连续赋值、case语句或if-else语句可以生成多路器电路,如果条件语句(case或if-else)中分支条件是互斥的话,综合器能自动地生成并行的多路器。多路器设计方案之一:modulemux1(out,a,b,sel);outputout;inputa,b,sel;assignout=sel?a:b;endmodule,多路器设计方案之二:modulemux2(out,a,b,sel);outputout;inputa,b,sel;regout;/用电平触发的always块来设计多路器的组合逻辑always(aorborsel)begin/*检查输入信号sel的值,如为1,输出out为a,如为0,输出out为b.*/case(sel)1b1:out=a;1b0:out=b;default:out=bx;endcaseendendmodule,多路器设计方案之三:modulemux3(out,a,b,sel);outputout;inputa,b,sel;regout;always(aorborsel)beginif(sel)out=a;elseout=b;endendmodule,例8.奇偶校验位生成器设计实例Moduleparity(even_numbits,odd_numbits,input_bus);outputeven_numbits,odd_numbits;input7:0input_bus;assignodd_numbits=input_bus;assigneven_numbits=input_bus;endmodule,例9.输出驱动器设计实例三态输出驱动器设计方案之一:moduletrist1(out,in,enable);outputout;inputin,enable;assignout=enable?in:bz;endmodule,三态输出驱动器设计方案之二:moduletrist2(out,in,enable);outputout;inputin,enable;/bufif1是一个Verilog门级原语(primitive)bufif1mybuf1(out,in,enable);endmodule,2.时序逻辑电路设计实例例1触发器设计实例moduledff(q,data,clk);outputq;inputdata,clk;regq;always(posedgeclk)beginq=data;endendmodule,例2.电平敏感型锁存器设计实例modulelatch3(q,data,clk);outputq;inputdata,clk;regq;always(clkordata)beginif(clk)q=data;endendmodule,例3.移位寄存器设计实例moduleshifter(din,clk,clr,dout);inputdin,clk,clr;output7:0dout;reg7:0dout;always(posedgeclk)beginif(clr)dout=8b0;/清零elsebegindout=dout1;/左移一位dout0=din;end/把输入信号放入寄存器的最低位endendmodule,例4.八位计数器设计实例之一modulecounter1(out,data,load,clk);output7:0out;input7:0data;inputload,clk;reg7:0out;,always(posedgeclk)beginif(load)out=data;elseout=out+1;end/只有当out7:0的所有各位都为1endmodule,例5.八位计数器设计实例之二modulecounter2(out,cout,data,load,clk);output7:0out;outputcout;input7:0data;inputload,clk;reg7:0out;regcout;reg7:0preout;,/创建8位寄存器always(posedgeclk)beginout=preout;end/*计算计数器和进位的下一个状态,注意:为提高性能不希望加载影响进位*/always(outordataorload)begincout,preout=out+1;if(load)preout=data;endendmodule,存储建模,目标学会如何用Verilog对存储器建模。学会如何用Verilog中对双向(即输入/输出)端口,(inout)建模。,存储器建模必须注意以下两个方面的问题:声明存储器容量的大小。明确对存储器访问操作的权限。例如:指出可以对存储器做以下哪几种操作:1)只读2)读写3)同步读写4)多次读,同时进行一次写5)多次同步读写,同时提供一些方法保证一致性,存储器建模,timescale1ns/10psmodulemyrom(read_data,addr,read_en_);inputread_en_;input3:0addr;output3:0read_data;reg3:0read_data;reg3:0mem0:15;initial$readmemb(“my_rom_data”,mem);always(addrorread_en_)if(!read_en_)read_data=memaddr;endmodule,简单ROM建模,my_rom_data0000010111000011110100100011111110001001100000011101101000011101,ROM的数据存储在另外的一个独立的文件中,简单ROM建模,上页所示的ROM模型说明:如何在Verilog中用二维的寄存器组来定义存储器。ROM中的数据保存在一个独立的文件中,如上页的右边的虚线方框所示。这是一种保存ROM数据的通用的方法,它可以使数据和ROM模型分开。,简单RAM建模,timescale1ns/1nsmodulemymem(data,addr,read,write);inout3:0data;input3:0addr;inputread,write;reg3:0memory0:15;/4bits,16words/从存储器读出到总线上assigndata=read?memoryaddr:4bz;/从总线写入存储器always(posedgewrite)memoryaddr=data;endmodule,简单RAM建模,RAM模型比ROM模型稍微复杂:它必须具有读写能力;进行读写时通常使用相同的数据总线;需要新技术来处理双向总线;当读信号无效时,RAM模型与总线脱离,如果此时写信号也无效,总线无驱动源,则总线进入高阻状态,这就避免了RAM中的读写竞争。,例:modulescalable_ROM(mem_word,address);parameteraddr_bits=8;/sizeofaddressbusparameterwordsize=8;/widthofawordparameterwords=(1addr_bits);/sizeofmemoutputwordsize:1mem_word;/wordofmemoryinputaddr_bits:1address;/addressbusregwordsize:1mem0:words-1;/memdeclaration/outputonewordofmemorywirewordsize:1mem_word=memaddress;endmodule,存储量可变的只读存储器建模,可以在初始化块中用一个循环或系统任务把初始数据存入存储器的每个单元。使用循环把值赋给存储器数组。for(i=0;imemsize;i=i+i)/initializememorymemai=wordsize1b1;调用$readmem系统任务。/从文件mem_file.txt中,把初始数据存入存储器(mem)的每个单元$readmemb(“mem_file.txt”,mem);注意:上面两项必须写在initial块中,加载这些初始化数据不需要时间。,存储器的加载,怎样使用双向口,使用inout关键字声明端口为双向口。inout7:0databus;使用双向口必需遵循下面的规则:inout口只能声明为网络连接类型,不允许把它声明为寄存器类型。(所以仿真器能确定多个驱动源的最终值。)在设计中,每次只能从一个方向来驱动inout口。例如:当使用总线读RAM中的数据时,如果同时又向RAM模型的双向数据总线写数据,就会产生逻辑竞争,导致总线数据无法确定。所以必须为inout口设计控制逻辑,只有这样才能保证正确的操作。,注意:声明一个inout口,可以用来输入或输出数据。inout口默认为网络连接类型。不允许在过程块(initial或always块)中对网络连接类型的数据进行过程赋值;但可以在过程块外把一个寄存器数据类型通过连续赋值语句赋给它(inout口)必须为inout口设计控制逻辑,用来保证正确的操作。当把inout口作为输入口时,必须通过控制逻辑禁止输出到inout口。,使用Verilog中的基本元件(bufif1)为双向口建模:,en_a_b,en_b_a,bus_a,bus_b,modulebus_xcvr(bus_a,bus_b,en_a_b,en_b_a);inoutbus_a,bus_b;inputen_a_b,en_b_a;bufiflb1(bus_b,bus_a,en_a_b);bufiflb2(bus_a,bus_b,en_b_a);/结构模块逻辑endmodule,当en_a_b=1时,元器件b1激活,bus_a的值传到bus_b上,当en_b_a=1时,元器件b1激活,bus_b的值传到bus_a上,注意:在上页的例子中,使用en_a_b和en_b_a来控制元器件bufifl,如果控制信号同时有效,则结果无法确定。所以必须把控制信号en_a_b和en_b_a在时间上分开。,使用连续赋值为双向口建模:,en_a_b,en_b_a,bus_a,bus_b,modulebus_xcvr(bus_a,bus_b,en_a_b,en_b_a);inoutbus_a,bus_b;inputen_a_b,en_b_a;assignbus_b=en_a_b?bus_a:bz;assignbus_a=en_b_a?bus_b:bz;/结构模块逻辑endmodule,当e
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 甘肃省企业劳动合同2篇
- 新解读《GB-T 31205-2014耐磨耐蚀钢铸件》
- 怎么续签合同范本
- 基金产品协议合同范本
- 个人装修平房合同范本
- 个人起诉租赁合同范本
- 简易道路救援合同范本
- 乡镇理论学习中心组学习总结及下一步学习计划
- 小产权车库合同范本
- 行业协会合作协议样本
- 乡镇卫生院医师三基考试理论综合试题及答案
- 动静脉内瘘狭窄病例分析
- 丝印考试题目及答案
- 软件无形资产管理办法
- 学堂在线 西方哲学精神探源 期末考试答案
- 微生物与人类的关系第1课时教学课件 2025-2026学年生物北师大版2024八年级上册
- 项目管理经验教训总结
- 《铁路运输安全管理》课件-第一章 铁路运输安全管理概述
- 高频变压器项目商业模式分析报告
- 中职生开学第一课安全教育
- 多重耐药菌感染防控与管理
评论
0/150
提交评论