Verilog设计实例.ppt

上传人:牧羊曲112 文档编号:5452075 上传时间:2023-07-08 格式:PPT 页数:44 大小:261.49KB
返回 下载 相关 举报
Verilog设计实例.ppt_第1页
第1页 / 共44页
Verilog设计实例.ppt_第2页
第2页 / 共44页
Verilog设计实例.ppt_第3页
第3页 / 共44页
Verilog设计实例.ppt_第4页
第4页 / 共44页
Verilog设计实例.ppt_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《Verilog设计实例.ppt》由会员分享,可在线阅读,更多相关《Verilog设计实例.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 3d0define minus 3d1define band 3d2define bor 3d3define u

2、negate 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);para

3、meter 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)b

4、egintmp=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口输入的值)位,并赋予ou

5、t*/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,

6、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 encoder

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

8、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;endmodu

9、le,多路器设计方案之二: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

10、(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);out

11、put 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=

12、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;

13、/左移一位 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+1b1;end/只有当out7:0的所有各位都为1endmodule,例5.八位计数器设计实例之二module counter2(out,cout,data,load,clk);ou

14、tput 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+1b1;if(load)preout=data;endendmodule,存储建模,目标学会如何用Verilog对存储器建模。学会如何用Verilog

15、中对双向(即输入/输出)端口,(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

16、$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中的数据保存在一个独立的文件中,如上页的右边的虚线方框所示。这是一

17、种保存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模型稍微复杂:它

18、必须具有读写能力;进行读写时通常使用相同的数据总线;需要新技术来处理双向总线;当读信号无效时,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

19、 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系统任

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

21、竞争,导致总线数据无法确定。所以必须为inout口设计控制逻辑,只有这样才能保证正确的操作。,注意:声明一个inout口,可以用来输入或输出数据。inout口默认为网络连接类型。不允许在过程块(initial 或always块)中对网络连接类型的数据进行过程赋值;但可以在过程块外把一个寄存器数据类型通过连续赋值语句赋给它(inout口)必须为inout口设计控制逻辑,用来保证正确的操作。当把inout口作为输入口时,必须通过控制逻辑禁止输出到inout口。,使用Verilog中的基本元件(bufif1)为双向口建模:,en_a_b,en_b_a,bus_a,bus_b,module bus_x

22、cvr(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

23、 在时间上分开。,使用连续赋值为双向口建模:,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_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_

24、b之间的数据交换。如果控制信号同时有效,则结果不能确定。所以必须把控制信号 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的下降沿到达时存入数据。上页模

25、块在 wr处于高电平时,通过数据总线写入数据,但必须保证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 这个时间段内,网络或寄存器类型的信号被强制赋值,而别处对该变量的赋值均无效。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号