1、西安邮电大学微电子系西安邮电大学微电子系西安邮电大学微电子系Verilog HDL模块设计实例模块设计实例苛颁齐宦嘉瞄虾诛梅轮丹巍汤侄酉看遮基磋慑鹏鹰斗抑藉潮幽柿洽胺薛庙Verilog7设计实例Verilog7设计实例1.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、漂酒否墩纤犊框蘸袱瘦撞Verilog7设计实例Verilog7设计实例例2指令译码电路的设计实例(利用电平敏感的always块来设计组合逻辑)/操作码的宏定义define plus 3d0define minus 3d1define band 3d2define bor 3d3define unegate 3d4延雪嘻茶凶鼎砂刚涡粘壬吉施窄迷陕磕柬篇创蘑守读龟策化剃魄规类镑桓Verilog7设计实例Verilog7设计实例module alu(out,opcode,a,b);output 7:0 out;input 2:0 opcode;input 7:0 a,b;reg 7:0 out;al
3、ways(opcode or a or b)/用电平敏感的always块描述/组合逻辑begincase(opcode)/算术运算plus:out=a+b;minus:out=a-b;/位运算band:out=a&b;bor:out=a|b;/单目运算unegate:out=a;default:out=8hx;endcaseendendmodule侦撕雅宗冷速箱绽爷差合少霄穷松纷推事竖锗受牺滁裳楔旭宜兹定馒邪铸Verilog7设计实例Verilog7设计实例例3.利用task和电平敏感的always块设计比较后重组信号的组合逻辑.module sort4(ra,rb,rc,rd,a,b,c,d
4、);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块描述组合逻辑奴夷沧述改盾娃念户辟瓤碳来纷谩蚁书曼锤碌丽晌宦绦禽社得敬乐逐咯来Verilog7设计实例Verilog7设计实例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=
5、va,vb,vc,vd;end霓贮酚蹋褥枫硕爪尼帮精窘婪圃毁芽蒙州挎激折道愤疟契解池哑晦弃职汀Verilog7设计实例Verilog7设计实例task sort2;inout t:0 x,y;reg t:0 tmp;if(x y)begintmp=x;x=y;y=tmp;endendtaskendmodule醉父郝书钧枣祝垫膛酌涵辊钦芥睹茶迎揪粱缘棺浆双篮念怪妨宛煽抒傍恰Verilog7设计实例Verilog7设计实例例4.比较器的设计实例(利用赋值语句设计组合逻辑)module compare(equal,a,b);parameter size=1;output equal;input si
6、ze-1:0 a,b;assign equal=(a=b)?1:0;endmodule赢茵薯簧描夺汐竿掸噶葱圃垦爽沙附捉挂鹤茹彭橙乏毖幢气谈优凭炉当屑Verilog7设计实例Verilog7设计实例例5.3-8译码器设计实例(利用赋值语句设计组合逻辑)module decoder(out,in);output 7:0 out;input 2:0 in;assign out=1b1in;/*把最低位的1左移 in(根据从in口输入的值)位,并赋予out */endmodule起掏俞刚滦芯蜡纠卤笆珊清琉柱此坡办依街汕症麓林灼脂他堵始狐堡突粒Verilog7设计实例Verilog7设计实例例6.8-
7、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;仗稼虎尊炮泌心俭矣座乌忿抵趁刨肃剖畸郝跌惦涝谣皿税冻凰壕狠娩遮均Verilog7设计实例Verilog7设计实例/*returns the value of the highest bit number turned on*/for(i=0;i8;i=i+1)beginif(ini)beginout=i;endendendendmodule枕泵蠢刃喀腰忿熄
8、吵四料楷尔僳尤紫镣去艾狭七隙燃蹿移涉正纳厉樊升牲Verilog7设计实例Verilog7设计实例编码器设计方案之二: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;as
9、sign out2=outvec2;assign out1=outvec1;assign out0=outvec0;endmodule部配辨阐懒验睡捏穴挝瞎撬植嫂哲酥鳖痘纹谦歼甲舵凸谰颊府缝桐勿待标Verilog7设计实例Verilog7设计实例编码器设计方案之三: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;
10、使腕锥瓷幂董眨坏撩粟江紧擅七涉袄梢怎膀话敷沧抓毅嫌梨既卵责观颂翔Verilog7设计实例Verilog7设计实例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;elseout
11、vec=4b1000;endendmodule深娜雌钢逞捞茶再酿耀焦贝城织赊面尘瞻攀绕斤赎剥怜哲达青聊霞解捆丈Verilog7设计实例Verilog7设计实例例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贬捐焰波固舷雀法猪浮妻登诱扛出赘拥慰肉匠脾乾峪我掣唾痒幽披雍卷卓Verilog7设
12、计实例Verilog7设计实例多路器设计方案之二: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醚扰皿鹿芒劣并您像叼赌咙侥线笑谚备膳寄钡贤达美佳瞒滦虱东耻爆踌辽Verilog7设计实例Verilog7设计实例多路器设计方案
13、之三: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多庙楷扇续测贺谩补铬抢出骋烩仅叠贬熟严悼互随程蚁丹差窃佯秦婉样橱Verilog7设计实例Verilog7设计实例例8.奇偶校验位生成器设计实例Module parity(even_numbits,odd_numbits,input_bus);output even_numbits,odd_numbits;input 7:0 input_bus;assig
14、n odd_numbits=input_bus;assign even_numbits=input_bus;endmodule笑俗锗吨呆扔陕掩熟偶呀客秧父位寐珠闸匣仆蚁蹄占范维罚侩残食瞳脉叙Verilog7设计实例Verilog7设计实例例9.输出驱动器设计实例三态输出驱动器设计方案之一:module trist1(out,in,enable);output out;input in,enable;assign out=enable?in:bz;endmodule扛求漓信龚懒氢旁取密惩职躺矩攀胞蓑尖炭喧检暇句渣什盟辣析蝗洱露央Verilog7设计实例Verilog7设计实例三态输出驱动器设计方
15、案之二:module trist2(out,in,enable);output out;input in,enable;/bufif1是一个Verilog门级原语(primitive)bufif1 mybuf1(out,in,enable);endmodule菜叔绢呀酚郊宿淆排悦终蒲辞澜俄魔铸棍脖瑞讲后阉杠炔搂嘉严援鳃烙赌Verilog7设计实例Verilog7设计实例2.时序逻辑电路设计实例时序逻辑电路设计实例例1触发器设计实例module dff(q,data,clk);output q;input data,clk;reg q;always(posedge clk)begin q=dat
16、a;endendmodule备戒荔樟惜伴歼兽戈他旧瓮电蚌戚另斌邑聪告韩环篓贩名污也辟抿寝尧袭Verilog7设计实例Verilog7设计实例例2.电平敏感型锁存器设计实例module latch3(q,data,clk);output q;input data,clk;reg q;always(clk or data)begin if(clk)q=data;endendmodule沙蜕效陪气谭笛爪脐霖屿逐迅锤灾臃集呛借狼隶谗藐曼已畅浅猴贵侵旨晓Verilog7设计实例Verilog7设计实例例3.移位寄存器设计实例module shifter(din,clk,clr,dout);input d
17、in,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蔡轧凿天荆讹亭睛犀厩码尸予蓖娥镰骇尧姨帛霞驼比吵挠勿阅墓须嘲烁尚Verilog7设计实例Verilog7设计实例例4.八位计数器设计实例之一module counter1(out,data,load,clk);output 7:0 out;input 7:0 data;input load,c
18、lk;reg 7:0 out;牵七堵防驳缺勃澄曙周池隔瀑抚爵略实帧疑悲绞吴卫镐疼民弧痢朽醋冬植Verilog7设计实例Verilog7设计实例always(posedge clk)begin if(load)out=data;else out=out+1b1;end/只有当out7:0的所有各位都为1endmodule桅酿胆煞许惠醒档课剧口狠销繁妓状仑浙新欺赘蓖屉芳捧粪味袭象膊铀月Verilog7设计实例Verilog7设计实例例5.八位计数器设计实例之二module counter2(out,cout,data,load,clk);output 7:0 out;output cout;inp
19、ut 7:0 data;input load,clk;reg 7:0 out;reg cout;reg 7:0 preout;效抖迫坤枣苇旗政熙扇豢路想赠寂陀解奢塞态铆巍罗驱咋例邢诚区陵锰鸵Verilog7设计实例Verilog7设计实例/创建8位寄存器 always(posedge clk)begin out=preout;end/*计算计数器和进位的下一个状态,注意:为提高性能不希望加载影响进位*/always(out or data or load)begin cout,preout=out+1b1;if(load)preout=data;endendmodule暗向祷快沸窄铺萎给追骤宛
20、券册霹桑蓝肮忆艳售辖迄窄都浦挛品鸣湖光悍Verilog7设计实例Verilog7设计实例存储建模目标目标学会如何用Verilog对存储器建模。学会如何用Verilog中对双向(即输入/输出)端口,(inout)建模。吁屠卵何忱橇秩亨各欧睛器髓硒吗例秸吝纲瘦皑颅源沪首暇钉翼卷抒土备Verilog7设计实例Verilog7设计实例存储器建模必须注意以下两个方面的问题:存储器建模必须注意以下两个方面的问题:声明存储器容量的大小。明确对存储器访问操作的权限。例如:指出可以对存储器做以下哪几种操作:1)只读 2)读写 3)同步读写 4)多次读,同时进行一次写 5)多次同步读写,同时提供一些方法保证一致性
21、存储器建模存储器建模再捌字纶后讣侨巴勉后搏薪粟计蛀脏捕附阁拨窗不兄锅喜福朝缝镶膛户始Verilog7设计实例Verilog7设计实例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
22、;endmodule 简单简单 ROM ROM 建模建模my_rom_datamy_rom_data 0000 0101 1100 0011 1101 0010 0011 1111 1000 1001 1000 0001 1101 1010 0001 1101 ROM ROM的数据存储的数据存储在另外的一个独在另外的一个独立的文件中立的文件中仔姑蜂嘿沙昔惨铆颗乳腕泅比男粪桅蔫蓟津通咱旷拷透钢磅卖篇掷介风傈Verilog7设计实例Verilog7设计实例简单简单ROMROM建模建模上页所示的上页所示的ROMROM模型说明:模型说明:如何在Verilog中用二维的寄存器组来定义存储器。ROM中的数
23、据保存在一个独立的文件中,如上页的右边的虚线方框所示。这是一种保存ROM数据的通用的方法,它可以使数据和ROM模型分开。楞考赋涎梢勋冕逆斯毁黍勤赋健劈影盖冕允雹衔壶鄙裙胸厨马辉撮常译纵Verilog7设计实例Verilog7设计实例简单简单RAMRAM建模建模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?memory
24、addr:4bz;/从总线写入存储器 always (posedge write)memoryaddr=data;endmodule枢渊割蟹够巡冗崎千氟愈膛带钱尽洱淖幻挠炳勿吮转账方岭龋香忠只灌佣Verilog7设计实例Verilog7设计实例简单简单RAMRAM建模建模RAMRAM模型比模型比ROMROM模型稍微复杂:模型稍微复杂:它必须具有读写能力;进行读写时通常使用相同的数据总线;需要新技术来处理双向总线;当读信号无效时,RAM模型与总线脱离,如果此时写信号也无效,总线无驱动源,则总线进入高阻状态,这就避免了RAM中的读写竞争。达摔砍害俺筏河俊赚咋泼课献俐氰桐滞伯刘猖材吻宴律碟滑添淑鲁鬼
25、瞎霉Verilog7设计实例Verilog7设计实例例:例: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-
26、1;/mem declaration/output one word of memory wire wordsize:1 mem_word=memaddress;endmodule存储量可变的只读存储器建模存储量可变的只读存储器建模漏碴赂迁产俺赛桑迭臆论警薪硕矢戈孕昼诉煮镜查刑段频祟鲤蓄眺职坡另Verilog7设计实例Verilog7设计实例 可以在初始化块中用一个循环或系统任务把初始数据存入存储器的每个单元。使用循环把值赋给存储器数组。for(i=0;imemsize;i=i+i)/initialize memory memai=wordsize1b1;调用$readmem系统任务。/从文件
27、 mem_file.txt 中,把初始数据存入存储器(mem)的每个单元$readmemb(“mem_file.txt”,mem);注意:注意:上面两项必须写 在initial 块中,加载这些初始化数据不需要时间。存储器的加载存储器的加载蔚华绑教褒焊瀑铰洞适颇喀态辫屉饥戏柏鼎箩叶腥窃含勤奥塔鼓逊眶炎蔚Verilog7设计实例Verilog7设计实例怎样使用双向口怎样使用双向口使用使用inout关键字声明端口为双向口。关键字声明端口为双向口。inout 7:0 databus;使用双向口必需遵循下面的规则:使用双向口必需遵循下面的规则:inout口只能声明为网络连接类型,不允许把它声明为寄存器类
28、型。(所以仿真器能确定多个驱动源的最终值。)在设计中,每次只能从一个方向来驱动inout口口。例如:当使用总线读RAM中的数据时,如果同时又向RAM模型的双向数据总线写数据,就会产生逻辑竞争,导致总线数据无法确定。所以必须为inout口设计控制逻辑,只有这样才能保证正确的操作。矢吕歧藩忘屏汽炉姻珐吸茧宗硒首鸦沦瘟橱骑厉蠕栗畜胃谤肋玲脏进赘怜Verilog7设计实例Verilog7设计实例 注意注意:声明一个inout口,可以用来输入或输出数据。inout口默认为网络连接类型。不允许在过程块(initial 或always块)中对网络连接类型的数据进行过程赋值;但可以在过程块外把一个寄存器数据类
29、型通过连续赋值语句赋给它(inout口)必须为inout口设计控制逻辑,用来保证正确的操作。当把inout口作为输入口时,必须通过控制逻辑禁止输出到inout口。祷愈番铲玖署沮惊畜肚契屿锭廊芹询盟黔膀溯阀铅字骄环传长嵌卡鞋梯惧Verilog7设计实例Verilog7设计实例使用使用Verilog中的基本元件(中的基本元件(bufif1)为双向口建模:)为双向口建模:b b2 2b b1 1en_a_ben_a_ben_b_aen_b_abus_abus_abus_bbus_bmodule bus_xcvr (bus_a,bus_b,en_a_b,en_b_a);inout bus_a,bus_
30、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=1en_a_b=1时,元器时,元器件件b1b1激活,激活,bus_abus_a的值传的值传到到bus_bbus_b上上 当当en_b_a=1en_b_a=1时,元器时,元器件件b1b1激活,激活,bus_bbus_b的值传的值传到到bus_abus_a上上难觉狈锄秆肝碱性瞳蠢腻菜伊网苍沼恬仆故沪动载蝎灾桓控牛搁瞒编茂愚Verilog7设计实例Verilog7设计实例 注意注意:在上
31、页的例子中,使用在上页的例子中,使用en_a_ben_a_b和和en_b_a en_b_a 来控制元器来控制元器件件bufifl,bufifl,如果控制信号同时有效,则结果无法确定。如果控制信号同时有效,则结果无法确定。所以必须把控制信号所以必须把控制信号 en_a_b en_a_b 和和 en_b_a en_b_a 在时间上分在时间上分开。开。凄纤豢技笑仿淹涉涟薯堵搬申熬口啤焊碍教机诈翁羊拯患估抹么施邢肌哟Verilog7设计实例Verilog7设计实例使用连续赋值使用连续赋值为双向口建模:为双向口建模:en_a_ben_a_ben_b_aen_b_abus_abus_abus_bbus_b
32、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=1en_a_b=1时,时,bus_abus_a的的值传到值传到bus_bbus_b上上当当en_b_a=1en_b_a=1时,时,bus_bbus_b的的值传到值传到bus_abus_a上上b b2 2b b1 1帽匙滦利毅缨窃验靴豹径牟戊路伸渗氛诌厦年踊码干全害使朱压
33、缩休卑绩Verilog7设计实例Verilog7设计实例 注意注意:在在assignassign语语句句中中,通通过过en_a_ben_a_b和和en_b_aen_b_a控控制制bus_abus_a与与bus_bbus_b之间的数据交换。之间的数据交换。如果控制信号同时有效,则结果不能确定。所以必须如果控制信号同时有效,则结果不能确定。所以必须把控制信号把控制信号 en_a_b en_a_b 和和 en_b_a en_b_a 在时间上分开。在时间上分开。产遥潜姿墓辅香捉访渍蹬制蹄罪朋湾帜透曝浓膊豌情命孕逻跺锗姿简藩辙Verilog7设计实例Verilog7设计实例存储器的端口建模:存储器的端口
34、建模:module ram_cell(databus,rd.wr);inout databus;input rd,wr;reg datareg;assign databus=rd?datareg:bz;always(negedge wr)datareg=databus;endmodule当当rdrd等于等于1 1时时dataregdatareg的的值被赋给值被赋给databusdatabus当当wrwr的下降沿到达时,的下降沿到达时,databusdatabus的值被写入的值被写入dataregdatareg测试模块测试模块RAMRAM单元单元数据总线数据总线数据数据寄存寄存器器rdrdwrw
35、r奈雌宙呜仰您矢轩耿证扩贫力酣哼狱酣釜扫装万压庚辨誓砂掉谷蒸主冕及Verilog7设计实例Verilog7设计实例 注意注意:上上页页中中存存储储单单元元在在wrwr的的下下降降沿沿到到达达时时存存入入数数据据。上上页页模模块块在在 wrwr处处于于高高电电平平时时,通通过过数数据据总总线线写写入入数数据据,但但必必须须保保证证wrwr的的高高电电平平维维持持时时间间长长于于数数据据的的写写入入时间。时间。在在rdrd处处于于高高电电平平时时,上上述述存存储储单单元元通通过过数数据据总总线线读读出出数数据据。由由于于此此模模型型为为单单口口存存储储模模型型,因因此此wrwr变变低低电电平平时时
36、,rdrd不不能能同同时时为为高高电电平平,否否则则就就无无法法确确定定存存储储器的读出器的读出/写入的结果。写入的结果。霸讨扁划办加杭疤毖吏辨衙殃疯胆衰七灌惶它诚悼倾盾酉狱簧祷汤秃囊谤Verilog7设计实例Verilog7设计实例 强制激励强制激励 force 和 release 用于寄存器类型和网络连接类型(例如:门级扫描寄存器的输出)的强制赋值,强制改写其它地方的赋值。initial begin#10 force top.dut.counter.scan_reg.q=0;#20 release top.dut.counter.scan_reg.q;end 在以上两个例子中,在10到20 这个时间段内,网络或寄存器类型的信号被强制赋值,而别处对该变量的赋值均无效。垂自绷分猩杏茄檄仍榆蜂维披柱蜕抡麓妇特怯伎厄蓉瞬曝庶赡团鸟报糠雅Verilog7设计实例Verilog7设计实例