已阅读5页,还剩39页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
西安邮电学院计算机系,Verilog HDL模块设计实例,1.组合逻辑电路设计实例:例1 八位带进位端的加法器的设计实例(利用简单的算法描述)module adder_8(cout,sum,a,b,cin);output cout;output 7:0 sum;input cin;input7:0 a,b;assign cout,sum=a+b+cin;endmodule,例2指令译码电路的设计实例(利用电平敏感的always块来设计组合逻辑)/操作码的宏定义define plus 3d0define minus 3d1define band 3d2define bor 3d3define unegate 3d4,module alu(out,opcode,a,b);output 7:0 out;input 2:0 opcode;input 7:0 a,b;reg 7:0 out;always (opcode or a or b)/用电平敏感的always块描述/组合逻辑begincase(opcode)/算术运算plus: out=a+b;,minus: out=a-b;/位运算band: out=aendcaseendendmodule,例3.利用task和电平敏感的always块设计比较后重组信号的组合逻辑.module sort4(ra,rb,rc,rd,a,b,c,d);parameter t=3;output t:0 ra, rb, rc, rd;input t:0 a, b, c, d;reg t:0 ra, rb, rc, rd;always (a or b or c or d)/用电平敏感的always块描述组合逻辑,begin reg t:0 va, 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,task sort2;inout t:0 x, y;reg t:0 tmp;if( x y )begintmp = x;x = y;y = tmp;endendtaskendmodule,例4. 比较器的设计实例(利用赋值语句设计组合逻辑)module compare(equal,a,b);parameter size=1;output equal;input size-1:0 a, b;assign equal =(a=b)? 1 : 0;endmodule,例5. 3-8译码器设计实例(利用赋值语句设计组合逻辑)module decoder(out,in);output 7:0 out;input 2:0 in;assign out = 1b1in;/* 把最低位的1左移 in(根据从in口输入的值)位,并赋予out */endmodule,例6. 8-3编码器的设计实例编码器设计方案之一:module encoder1(out,in);output 2:0 out;input 7:0 in;reg 2:0 out;always (in) begin: local integer i; out = 0;,/*returns the value of the highest bit number turned on*/for( i=0; i8; i=i+1 )beginif( ini )beginout = i;endendendendmodule,编码器设计方案之二:module encoder2 ( none_on, out2, out1, out0, h, g, f, e, d, c, b, a);input h, g, f, e, d, c, b, a;output none_on, out2, out1, out0;wire 3:0 outvec;assign outvec= h? 4b0111 : g? 4b0110 : f? 4b0101:e? 4b0100 : d? 4b0011 :c? 4b0010 : b? 4b0001:a? 4b0000 : 4b1000;assign none_on = outvec3;assign out2 = outvec2;assign out1 = outvec1;assign out0 = outvec0;endmodule,编码器设计方案之三:module encoder3 (none_on, out2, out1, out0, h, g,f, e, d, c, b, a);input h, g, f, e, d, c, b, a;output out2, out1, out0;output none_on;reg 3:0 outvec;assign none_on,out2,out1,out0 = outvec;,always ( a or b or c or d or e or f or g or h)begin if(h) outvec=4b0111; else if(g)outvec=4b0110; else if(f)outvec=4b0101; else if(e)outvec=4b0100; else if(d)outvec=4b0011; else if(c)outvec=4b0010; else if(b)outvec=4b0001; else if(a)outvec=4b0000; elseoutvec=4b1000;endendmodule,例7. 多路器的设计实例。使用连续赋值、case语句或if-else语句可以生成多路器电路,如果条件语句(case或if-else)中分支条件是互斥的话,综合器能自动地生成并行的多路器。多路器设计方案之一:modul emux1(out, a, b, sel);output out;input a, b, sel;assign out = sel? a : b;endmodule,多路器设计方案之二:module mux2( out, a, b, sel);output out;input a, b, sel;reg out;/用电平触发的always块来设计多路器的组合逻辑always ( a or b or sel )begin/*检查输入信号sel的值,如为1,输出out为a,如为0,输出out为b.*/case( sel ) 1b1: out = a; 1b0: out = b; default: out = bx;endcaseendendmodule,多路器设计方案之三:module mux3( out, a, b, sel);output out;input a, b, sel;reg out;always ( a or b or sel )beginif( sel )out = a;elseout = b;endendmodule,例8. 奇偶校验位生成器设计实例Module parity( even_numbits,odd_numbits, input_bus);output even_numbits, odd_numbits;input 7:0 input_bus;assign odd_numbits = input_bus;assign even_numbits = input_bus;endmodule,例9. 输出驱动器设计实例三态输出驱动器设计方案之一:module trist1( out, in, enable);output out;input in, enable;assign out = enable? in: bz;endmodule,三态输出驱动器设计方案之二:module trist2( out, in, enable );output out;input in, enable;/bufif1是一个Verilog门级原语(primitive)bufif1 mybuf1(out, in, enable);endmodule,2. 时序逻辑电路设计实例例1触发器设计实例module dff( q, data, clk);output q;input data, clk;reg q;always ( posedge clk ) begin q = data; endendmodule,例2. 电平敏感型锁存器设计实例module latch3( q, data, clk);output q;input data, clk;reg q;always (clk or data)begin if(clk) q=data;endendmodule,例3. 移位寄存器设计实例module shifter( din, clk, clr, dout);input din, clk, clr;output 7:0 dout;reg 7:0 dout;always (posedge clk)begin if(clr)dout = 8b0; /清零 else begin dout = dout1;/左移一位 dout0 = din; end/把输入信号放入寄存器的最低位endendmodule,例4. 八位计数器设计实例之一module counter1( out, data, load, clk);output 7:0 out;input 7:0 data;input load, clk;reg 7:0 out;,always (posedge clk)begin if( load ) out = data; else out = out + 1;end/只有当out7:0的所有各位都为1endmodule,例5. 八位计数器设计实例之二module counter2( out, cout, data, load, clk);output 7:0 out;output cout;input 7:0 data;input load, clk;reg 7:0 out;reg cout;reg 7:0 preout;,/创建8位寄存器 always (posedge clk) begin out = preout; end/*计算计数器和进位的下一个状态,注意:为提高性能不希望加载影响进位*/always ( out or data or load )begin cout, preout = out + 1; if(load) preout = data;endendmodule,存储建模,目标学会如何用Verilog对存储器建模。学会如何用Verilog中对双向(即输入/输出)端口, (inout)建模。,存储器建模必须注意以下两个方面的问题:声明存储器容量的大小。明确对存储器访问操作的权限。例如:指出可以对存储器做以下哪几种操作: 1)只读 2)读写 3)同步读写 4)多次读,同时进行一次写 5)多次同步读写,同时提供一些方法保证一致性,存储器建模,timescale 1ns/10ps module myrom(read_data,addr,read_en_); input read_en_; input 3:0 addr; output 3:0 read_data; reg 3:0 read_data;reg 3:0 mem 0:15;initial $readmemb(“my_rom_data”,mem);always (addr or read_en_) if(!read_en_) read_data=memaddr;endmodule,简单 ROM 建模,my_rom_data 0000 0101 1100 0011 1101 0010 0011 1111 1000 1001 1000 0001 1101 1010 0001 1101,ROM的数据存储在另外的一个独立的文件中,简单ROM建模,上页所示的ROM模型说明:如何在Verilog中用二维的寄存器组来定义存储器。ROM中的数据保存在一个独立的文件中,如上页的右边的虚线方框所示。这是一种保存ROM数据的通用的方法,它可以使数据和ROM模型分开。,简单RAM建模,timescale 1ns/1nsmodule mymem(data,addr,read,write); inout 3:0 data; input 3:0 addr; input read, write; reg 3:0 memory 0:15; /4 bits, 16 words/从存储器读出到总线上 assign data=read? memoryaddr:4bz;/从总线写入存储器 always (posedge write) memoryaddr=data;endmodule,简单RAM建模,RAM模型比ROM模型稍微复杂:它必须具有读写能力;进行读写时通常使用相同的数据总线;需要新技术来处理双向总线;当读信号无效时,RAM模型与总线脱离,如果此时写信号也无效,总线无驱动源,则总线进入高阻状态, 这就避免了RAM中的读写竞争。,例:module scalable_ROM (mem_word, address); parameter addr_bits=8; /size of address bus parameter wordsize=8; /width of a word parameter words=(1addr_bits); /size of mem output wordsize:1 mem_word; /word of memory input addr_bits:1 address; /address bus reg wordsize:1 mem 0 : words-1; /mem declaration/output one word of memory wire wordsize:1 mem_word=memaddress;endmodule,存储量可变的只读存储器建模,可以在初始化块中用一个循环或系统任务把初始数据存入存储器的每个单元。 使用循环把值赋给存储器数组。 for(i=0;imemsize;i=i+i) / initialize memory memai=wordsize1b1;调用$readmem系统任务。 /从文件 mem_file.txt 中, 把初始数据存入存储器(mem)的每个单元 $readmemb(“mem_file.txt”,mem); 注意:上面两项必须写 在initial 块中,加载这些初始化数据不需要时间。,存储器的加载,怎样使用双向口,使用inout关键字声明端口为双向口。 inout 7:0 databus;使用双向口必需遵循下面的规则: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,module bus_xcvr (bus_a,bus_b,en_a_b,en_b_a);inout bus_a,bus_b;input en_a_b,en_b_a; bufifl b1(bus_b,bus_a,en_a_b); bufifl b2(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,module bus_xcvr (bus_a,bus_b,en_a_b,en_b_a);inout bus_a,bus_b;input en_a_b,en_b_a; assign bus_b=en_a_b? bus_a:bz; assign bus_a=en
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教版四年级数学下册《从同一位置观察用正方体搭成的3个几何组合体》教学设计
- 2026年学前儿童科学探索兴趣测试
- 2026年环境保护与生态保护知识竞赛试卷
- 2026年管理学原理重点知识点习题集
- 2026年金融法规与政策考点巩固习题
- 2026年部编版五年级科学下册第12单元知识点巩固习题
- 2026年陕西省湘教版初中英语八年级下册听力理解专项训练
- 2026年环境保护与生态恢复知识测试
- 2026年全民科普知识竞赛试卷
- 2026年公务员行测判断推理真题汇编及解析
- 第一轮-【黄磷企业检查表】-检查表
- 园区创新创业孵化基地可行性研究报告
- 散热器安装施工工艺流程
- 2026广东江门市规划勘察设计研究院有限公司招聘7人备考题库含答案详解(a卷)
- 2025年重庆市从“五方面人员”中选拔乡镇领导班子成员考试历年参考题库含答案详解
- 文书模板-中标单位情况说明
- 2026第二届全国红旗杯班组长大赛考试备考核心试题库500题
- 2026年常德职业技术学院单招职业技能测试题库附答案详解(综合卷)
- 2026年安徽高中化学竞赛初赛试题及答案
- 企业用工管理培训课件
- 灰渣处置安全培训课件
评论
0/150
提交评论