《Verilog设计实例》PPT课件.ppt

上传人:san****019 文档编号:15681637 上传时间:2020-08-29 格式:PPT 页数:44 大小:399.10KB
收藏 版权申诉 举报 下载
《Verilog设计实例》PPT课件.ppt_第1页
第1页 / 共44页
《Verilog设计实例》PPT课件.ppt_第2页
第2页 / 共44页
《Verilog设计实例》PPT课件.ppt_第3页
第3页 / 共44页
资源描述:

《《Verilog设计实例》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《Verilog设计实例》PPT课件.ppt(44页珍藏版)》请在装配图网上搜索。

1、西安邮电大学微电子系,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 3d0 define minus 3d1 define band 3d2 define b

2、or 3d3 define 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块描述/组合逻辑 begin case(opcode) /算术运算 plus: out=a+b;,minus: out=a-b; /位运算 band: out=a endcase end endmodule,例3.利用task和电平敏感的always块设 计比较后重组信号的组合逻辑. mo

3、dule 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

4、=va,vb,vc,vd; end,task sort2; inout t:0 x, y; reg t:0 tmp; if( x y ) begin tmp = x; x = y; y = tmp; end endtask endmodule,例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译码器设计实例(利用赋 值语句设计组合逻辑) mo

5、dule 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

6、number turned on*/ for( i=0; i8; i=i+1 ) begin if( ini ) begin out = i; end end end endmodule,编码器设计方案之二: 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? 4b

7、0101: 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, o

8、ut1, 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=4

9、b0001; else if(a)outvec=4b0000; elseoutvec=4b1000; end endmodule,例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, s

10、el); 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; endcase end endmodule,多路器设计方案之三: module mux3( out, a, b, sel); output out; input a, b, sel; reg out;

11、 always ( a or b or sel ) begin if( sel ) out = a; else out = b; end endmodule,例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. 输出驱动器设计实例 三态输出驱动器

12、设计方案之一: 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(

13、q, data, clk); output q; input data, clk; reg q; always ( posedge clk ) begin q = data; end endmodule,例2. 电平敏感型锁存器设计实例 module latch3( q, data, clk); output q; input data, clk; reg q; always (clk or data) begin if(clk) q=data; end endmodule,例3. 移位寄存器设计实例 module shifter( din, clk, clr, dout); input di

14、n, 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/把输入信号放入寄存器的最低位 end endmodule,例4. 八位计数器设计实例之一 module counter1( out, data, load, clk); output 7:0 out; input 7:0 data; input load, clk; reg 7:0 out;,always (pose

15、dge clk) begin if( load ) out = data; else out = out + 1b1; end /只有当out7:0的所有各位都为1 endmodule,例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 = pr

16、eout; end /*计算计数器和进位的下一个状态, 注意:为提高性能不希望加载影响进位*/ always ( out or data or load ) begin cout, preout = out + 1b1; if(load) preout = data; end endmodule,存储建模,目标 学会如何用Verilog对存储器建模。 学会如何用Verilog中对双向(即输入/输出)端口, (inout)建模。,存储器建模必须注意以下两个方面的问题: 声明存储器容量的大小。 明确对存储器访问操作的权限。 例如:指出可以对存储器做以下哪几种操作: 1)只读 2)读写 3)同步读写

17、 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,

18、简单 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/1ns module mymem(data,addr,read,write)

19、; 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模型与总线脱离,如果此时写信号也无效,总线无驱

20、动源,则总线进入高阻状态, 这就避免了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 m

21、em 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)的每个单元 $readmem

22、b(“mem_file.txt”,mem); 注意:上面两项必须写 在initial 块中,加载这些初始化数据不需要时间。,存储器的加载,怎样使用双向口,使用inout关键字声明端口为双向口。 inout 7:0 databus; 使用双向口必需遵循下面的规则: inout口只能声明为网络连接类型, 不允许把它声明为寄存器类型。(所以仿真器能确定多个驱动源的最终值。) 在设计中,每次只能从一个方向来驱动inout口。 例如:当使用总线读RAM中的数据时,如果同时又向RAM模型的双向数据总线写数据,就会产生逻辑竞争,导致总线数据无法确定。所以必须为inout口设计控制逻辑,只有这样才能保证正确的

23、操作。,注意: 声明一个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 bu

24、s_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

25、_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_b_a? bus_b:bz; /结构模块逻辑 endmodule,当en_a_b=1时,bus_a的值传到bus_b上,当en_b_a=1时,bus_b的值传到bus_a上,注意: 在assign语句中,通过en_a_b和en_b_a控制bus_a与bus_b之间的数据交换。 如果控制信号同时有效,则

26、结果不能确定。所以必须把控制信号 en_a_b 和 en_b_a 在时间上分开。,存储器的端口建模:,module ram_cell(databus,rd.wr); inout databus; input rd,wr; reg datareg; assign databus=rd? datareg:bz; always (negedge wr) datareg=databus; endmodule,当rd等于1时datareg的值被赋给databus,当wr的下降沿到达时,databus的值被写入datareg,注意: 上页中存储单元在wr的下降沿到达时存入数据。上页模块在 wr处于高电平时

27、,通过数据总线写入数据,但必须保证wr的高电平维持时间长于数据的写入时间。 在rd处于高电平时,上述存储单元通过数据总线读出数据。由于此模型为单口存储模型,因此wr变低电平时,rd不能同时为高电平,否则就无法确定存储器的读出/写入的结果。,强制激励 force 和 release 用于寄存器类型和网络连接类型(例如:门级扫描寄存器的输出)的强制赋值,强制改写其它地方的赋值。 initial begin # 10 force top.dut.counter.scan_reg.q=0; # 20 release top.dut.counter.scan_reg.q; end 在以上两个例子中,在10到20 这个时间段内,网络或寄存器类型的信号被强制赋值,而别处对该变量的赋值均无效。,

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!