版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Verilog设计的描述风格设计的描述风格o 结构(结构(Structural)描述描述o 行为(行为(Behavioural)描述描述o 数据流(数据流(Data Flow)描述描述7.1 Verilog设计的层次设计的层次在在Verilog程序中可通过如下方式描述电路的程序中可通过如下方式描述电路的结构结构 调用调用Verilog内置门元件(门级结构描述)内置门元件(门级结构描述) 调用开关级元件(晶体管级结构描述)调用开关级元件(晶体管级结构描述) 用户自定义元件用户自定义元件UDP(也在门级)(也在门级)7.2 结构(结构(Structural)描述描述Verilog的的内置门元件内置
2、门元件 门元件的调用门元件的调用调用门元件的格式为:调用门元件的格式为:门元件名字门元件名字 ()其中普通门的端口列表按下面的顺序列出:其中普通门的端口列表按下面的顺序列出:(输出,输入(输出,输入1,输入,输入2,输入,输入3););比如:比如:and a1(out,in1,in2,in3);/三输入三输入与门与门对于三态门,则按如下顺序列出输入输出端口:对于三态门,则按如下顺序列出输入输出端口:(输出,输入,使能控制端);(输出,输入,使能控制端);比如:比如:bufif1 mytri1(out,in,enable);/高电平高电平使能的三态门使能的三态门门元件的调用门元件的调用对于对于b
3、uf和和not两种元件的调用,需注意两种元件的调用,需注意的是:它们允许有多个输出,但只能的是:它们允许有多个输出,但只能有一个输入。比如:有一个输入。比如: not N1(out1,out2,in); /1个输入个输入in,2个输出个输出out1,out2 buf B1(out1,out2,out3,in); /1个输入个输入in,3个输出个输出out1,out2,out3【例【例7.1】 调用门元件实现的调用门元件实现的4选选1 MUXmodule mux4_1a(out,in1,in2,in3,in4,s0,s1);input in1,in2,in3,in4,s0,s1; output
4、out;wire s0_n,s1_n,w,x,y,z;not (sel0_n,s0),(s1_n,s1);and (w,in1,s0_n,s1_n),(x,in2,s0_n,s1), (y,in3,s0,s1_n),(z,in4,s0,s1);or (out,w,x,y,z);endmodule用基本门实现的用基本门实现的4选选1 MUX原理图原理图 7.3 行为描述行为描述就是对设计实体的数学模型的描述,其抽象就是对设计实体的数学模型的描述,其抽象程度远高于结构描述方式。行为描述类程度远高于结构描述方式。行为描述类似于高级编程语言,当描述一个设计实似于高级编程语言,当描述一个设计实体的行为时
5、,无需知道具体电路的结构,体的行为时,无需知道具体电路的结构,只需要描述清楚输入与输出信号的行为,只需要描述清楚输入与输出信号的行为,而不需要花费更多的精力关注设计功能而不需要花费更多的精力关注设计功能的门级实现。的门级实现。 【例例7.2】 用用case语句描述的语句描述的4选选1 MUXmodule mux4_1b(out,in1,in2,in3,in4,s0,s1);input in1,in2,in3,in4,s0,s1; output reg out;always(*) /使用通配符使用通配符case(s0,s1)2b00:out=in1;2b01:out=in2;2b10:out=i
6、n3;2b11:out=in4;default:out=2bx;endcaseendmodule采用行为描述方式时需注意采用行为描述方式时需注意 用行为描述模式设计电路,可以降低设计难用行为描述模式设计电路,可以降低设计难度。行为描述只需表示输入与输出之间的关度。行为描述只需表示输入与输出之间的关系,不需要包含任何结构方面的信息。系,不需要包含任何结构方面的信息。 设计者只需写出源程序,而挑选电路方案的设计者只需写出源程序,而挑选电路方案的工作由工作由EDA软件自动完成。软件自动完成。在电路的规模较大或者需要描述复杂的逻辑关在电路的规模较大或者需要描述复杂的逻辑关系时,应首先考虑用行为描述方式
7、设计电路,系时,应首先考虑用行为描述方式设计电路,如果设计的结果不能满足资源占有率的要求,如果设计的结果不能满足资源占有率的要求,则应改变描述方式。则应改变描述方式。7.4 数据流描述数据流描述数据流描述方式主要使用持续赋值语句,数据流描述方式主要使用持续赋值语句,多用于描述组合逻辑电路,其格式为:多用于描述组合逻辑电路,其格式为: assign LHS_net=RHS_expression;右边表达式中的操作数无论何时发生变右边表达式中的操作数无论何时发生变化,都会引起表达式值的重新计算化,都会引起表达式值的重新计算, 并将重新计算后的值赋予左边表达式并将重新计算后的值赋予左边表达式的的ne
8、t型变量。型变量。 【例例7.4】 数据流描述的数据流描述的4选选1 MUXmodule mux4_1c(out,in1,in2,in3,in4,s0,s1);input in1,in2,in3,in4,s0,s1; output out;assign out=(in1 & s0 & s1)|(in2 & s0 & s1)|(in3& s0 & s1)|(in4 & s0 & s1);endmodule数据流描述数据流描述用数据流描述模式设计电路与用传统的用数据流描述模式设计电路与用传统的逻辑方程设计电路很相似。设计中只逻辑方程设
9、计电路很相似。设计中只要有了布尔代数表达式就很容易将它要有了布尔代数表达式就很容易将它用数据流方式表达出来。表达方法是用数据流方式表达出来。表达方法是用用Verilog中的逻辑运算符置换布尔中的逻辑运算符置换布尔逻辑运算符即可。逻辑运算符即可。比如,如果逻辑表达式为:,则用数据比如,如果逻辑表达式为:,则用数据流方式描述为:流方式描述为: assign F=(a&b)|(c&d)。7.5 不同描述风格的设计不同描述风格的设计对设计者而言,采用的描述级别越高,设计对设计者而言,采用的描述级别越高,设计越容易;对综合器而言,行为级的描述越容易;对综合器而言,行为级的描述为综合器的优
10、化提供了更大的空间,较为综合器的优化提供了更大的空间,较之门级结构描述更能发挥综合器的性能,之门级结构描述更能发挥综合器的性能,所以在电路设计中,除非一些关键路径所以在电路设计中,除非一些关键路径的设计采用门级结构描述外,一般更多的设计采用门级结构描述外,一般更多地采用行为建模方式。地采用行为建模方式。 【例例7.12】 调用门元件实现的调用门元件实现的1位全加器位全加器module full_add1(a, b, module full_add1(a, b, cincin, sum, , sum, coutcout); );input a, b, input a, b, cincin; ;o
11、utput sum, output sum, coutcout; ;wire s1,m1, m2, m3;wire s1,m1, m2, m3;and (m1, a, b),and (m1, a, b), (m2, b, (m2, b, cincin), ), (m3, a, (m3, a, cincin); );xorxor (s1, a, b), (s1, a, b), (sum, s1, (sum, s1, cincin); );or (or (coutcout, m1, m2, m3);, m1, m2, m3);endmoduleendmodule数据流描述的数据流描述的1位全加器位
12、全加器module full_add2(a,b,cin,sum,cout);input a, b, cin;output sum, cout;assign sum = a b cin;assign cout = (a & b ) | (b & cin ) | (cin & a );endmodule行为描述的行为描述的1位全加器位全加器【例例7.14】 行为描述的行为描述的1位全加器位全加器module full_add3(a,b,cin,sum,cout);input a,b,cin; output reg sum,cout;always * /或写为或写为alway
13、s (a or b or cin)begin cout,sum=a+b+cin; endendmodule两个半加器构成一个全加器两个半加器构成一个全加器 【例例7.15】 用模块例化方式设计的用模块例化方式设计的1位全加器顶位全加器顶层设计层设计module full_add(ain,bin,cin,sum,cout);input ain,bin,cin; output sum,cout;wire d,e,f; /用于内部连接的节点信号用于内部连接的节点信号half_add u1(ain,bin,e,d); /半加器模块调用,采用位置关联方式半加器模块调用,采用位置关联方式half_add
14、u2(e,cin,sum,f); or u3(cout,d,f); /或门调用或门调用endmodule【例例7.16】 半加器定义半加器定义module half_add(a,b,so,co);input a,b; output so,co;assign co=a&b; assign so=ab;endmodule4 4位加法器设计位加法器设计module add4_1(sum,cout,a,b,cin);output 3:0 sum;output cout;input 3:0 a,b;input cin; full_add1 f0(a0,b0,cin,sum0,cin1);full
15、_add1 f1(a1,b1,cin1,sum1,cin2);full_add1 f2(a2,b2,cin2,sum2,cin3);full_add1 f3(a3,b3,cin3,sum3,cout);endmodule结构描述的结构描述的4位级连全加器位级连全加器【例例7.18】 数据流描述的数据流描述的4位加法器位加法器module add4_2(cout,sum,a,b,cin);input cin; input3:0 a,b; output3:0 sum; output cout;assign cout,sum=a+b+cin;endmoduleu如果数字系统比较复杂,可采用如果数字系
16、统比较复杂,可采用“Top-down”的方法进行设的方法进行设计。首先把系统分为几个模块,每个模块再分为几个子模块,计。首先把系统分为几个模块,每个模块再分为几个子模块,以此类推,直到易于实现为止。这种以此类推,直到易于实现为止。这种“Top-down”的方法能够的方法能够把复杂的设计分解为许多简单的逻辑来实现,同时也适合于多把复杂的设计分解为许多简单的逻辑来实现,同时也适合于多人进行分工合作,如同用人进行分工合作,如同用C语言编写大型软件一样。语言编写大型软件一样。Verilog语语言能够很好地支持这种言能够很好地支持这种“Top-down”的设计方法的设计方法u多层次结构电路的描述既可以采
17、用文本方式,也可以用图多层次结构电路的描述既可以采用文本方式,也可以用图形和文本混合设计的方式。用一个形和文本混合设计的方式。用一个8位累加器的设计为例来位累加器的设计为例来说明这两种设计方式。说明这两种设计方式。8位全加器位全加器module add8(sum,cout,b,a,cin);output7:0 sum;output cout;input7:0 a,b;input cin;assign cout,sum=a+b+cin;endmodule8位寄存器位寄存器module reg8(qout,in,clk,clear);output7:0 qout;input7:0 in;input
18、 clk,clear;reg7:0 qout;always (posedge clk or posedge clear)beginif(clear) qout=0; /异步清异步清0else qout=in;endendmodulemodule acc(accout,cout,accin,cin,clk,clear);output7:0 accout;output cout;input7:0 accin;input cin,clk,clear;wire7:0 sum;add8 accadd8(sum,cout,accout,accin,cin); /调用调用add8子模块子模块reg8 acc
19、reg8(accout,sum,clk,clear); /调用调用reg8子模块子模块endmodule累加器顶层文本描述累加器顶层文本描述 对于上面的模块调用,可采用位置对应的方式,即调用时对于上面的模块调用,可采用位置对应的方式,即调用时模块端口列表中信号的排列顺序与模块定义时端口列表中的信模块端口列表中信号的排列顺序与模块定义时端口列表中的信号排列顺序相同;也可以采用信号名对应方式,此时不必按顺号排列顺序相同;也可以采用信号名对应方式,此时不必按顺序,例如上面对序,例如上面对reg8的调用:的调用:module reg8(qout,in,clk,c lear);/reg8的模块声明的模块
20、声明reg8 accreg8(accout,sum,clk,clear); /调用方式调用方式1,位置对应,位置对应Reg8 accreg8(.qout(accout),.clear(clear), .in(sum),.clk(clk);/调用方式调用方式2,信号名对应,信号名对应7.7 基本组合电路设计基本组合电路设计 门级结构描述门级结构描述 module gate1(F,A,B,C,D);input A,B,C,D;output F;nand(F1,A,B); /调用门元件调用门元件and(F2,B,C,D);or(F,F1,F2);endmodule 数据流描述数据流描述module
21、gate2(F,A,B,C,D);input A,B,C,D;output F;assign F=(A&B)|(B&C&D);endmodule【例例7.24】 74138的的Verilog描述描述module ttl74138(a,y,g1,g2a,g2b);input2:0 a; input g1,g2a,g2b; output reg7:0 y;always (*) begin if(g1 & g2a & g2b) /只有当只有当g1、g2a、g2b为为100时,译码器使能时,译码器使能begin case(a)3b000:y=8b11111110
22、; /译码输出译码输出3b001:y=8b11111101;3b010:y=8b11111011;3b011:y=8b11110111;3b100:y=8b11101111;3b101:y=8b11011111;3b110:y=8b10111111;3b111:y=8b01111111;default:y=8b11111111;endcase endelse y=8b11111111; endendmodule【例例7.25】 8线线3线优先编码器线优先编码器74148的的Verilog描述描述module ttl74148(din,ei,gs,eo,dout);input7:0 din; i
23、nput ei; output reg gs,eo; output reg2:0 dout;always (ei,din) begin if(ei) begin dout=3b111;gs=1b1;eo=1b1; endelse if(din=8b111111111) begin dout=3b111;gs=1b1;eo=1b0;endelse if(!din7) begin dout=3b000;gs=1b0;eo=1b1;endelse if(!din6) begin dout=3b001;gs=1b0;eo=1b1;endelse if(!din5) begin dout=3b010;g
24、s=1b0;eo=1b1;endelse if(!din4) begin dout=3b011;gs=1b0;eo=1b1;endelse if(!din3) begin dout=3b100;gs=1b0;eo=1b1;endelse if(!din2) begin dout=3b101;gs=1b0;eo=1b1;endelse if(!din1) begin dout=3b110;gs=1b0;eo=1b1;endelse begin dout=3b111;gs=1b0;eo=1b1;end endendmodule【例例7.27】 奇偶校验位产生器奇偶校验位产生器module pari
25、ty(even_bit,odd_bit,a);input7:0 a; output even_bit,odd_bit;assign even_bit=a; /生成偶校验位生成偶校验位assign odd_bit=even_bit; /生成奇校验位生成奇校验位endmodule 7.8 基本时序电路设计基本时序电路设计【例例7.29】 带异步清带异步清0/异步置异步置1的的JK触发器触发器module jkff_rs(clk,j,k,q,rs,set);input clk,j,k,set,rs; output reg q;always (posedge clk, negedge rs, nege
26、dge set)begin if(!rs) q=1b0;else if(!set) q=1b1;else case(j,k)2b00:q=q;2b01:q=1b0;2b10:q=1b1;2b11:q=q;default:q=1bx;endcaseendendmodule【例例7.30】 电平敏感的电平敏感的1位数据锁存器位数据锁存器module latch1(q,d,le);input d,le; output q;assign q=le?d:q; /le为高电平时,将输入端数据锁存为高电平时,将输入端数据锁存endmodule【例例7.31】 带置位带置位/复位端的复位端的1位数据锁存器位数
27、据锁存器module latch2(q,d,le,set,reset);input d,le,set,reset; output q;assign q=reset?0:(set? 1:(le?d:q);endmodule【例例7.32】 8位数据锁存器(位数据锁存器(74LS373)module ttl373(le,oe,q,d);input le,oe; input7:0 d; output reg7:0 q;always * /或写为或写为always (le,oe,d)begin if(oe & le) q=d; /或写为或写为if(!oe) & (le)else q=8
28、bz;endendmodule【例例7.33】 数据寄存器数据寄存器module reg_w(dout,din,clk,clr);parameter WIDTH=7;input clk,clr; inputWIDTH:0 din;output regWIDTH:0 dout;always (posedge clk, posedge clr)begin if(clr) dout=0;else dout=din; endendmodule【例例7.35】 可变模加法可变模加法/减法计数器减法计数器module updown_count(d,clk,clear,load,up_down,qd);in
29、put clk,clear,load,up_down;input7:0 d; output7:0 qd; reg7:0 cnt;assign qd=cnt;always (posedge clk)begin if(!clear) cnt=8h00; /同步清同步清0,低电平有效,低电平有效else if(load) cnt=d;/同步预置同步预置else if(up_down) cnt=cnt+1; /加法计数加法计数else cnt=cnt-1; /减法计数减法计数endendmodule【例例7.39】 行为描述的三态门行为描述的三态门module tristate1(in,en,out)
30、;input in,en; output reg out;always (in or en)begin if(en) out=in; else out=1bz; endendmodule【例例7.40】 调用门元件调用门元件bufif1描述的三态门描述的三态门module tristate2(in,en,out);input in,en; output out; tri out;bufif1 b1(out,in,en);/注意三态门端口的排列顺序注意三态门端口的排列顺序endmodule【例例7.41】 数据流描述的三态门数据流描述的三态门module tristate3(out,in,en)
31、;input in,en; output out;assign out=en?in:1bz; /若若en=1,out=in;/若若en=0,out为高阻态为高阻态endmodule【例例7.42】 三态双向驱动器三态双向驱动器module bidir(y,a,en,b);input a,en; output b; inout y;assign y=en?a:bz; assign b=y;endmodule【例例7.44】 三态双向总线缓冲器三态双向总线缓冲器module ttl245(a,b,oe,dir);input oe,dir; /使能信号和方向控制使能信号和方向控制inout7:0 a,b; /双向数据线双向数据线assign a=(oe,dir=2b00)?b:8bz;assign b=(oe,dir=2b01)?a:8bz;endmodule生成一个新的宏模块生成一个新的宏模块 设置输出文件的类型、目录和名字设置输出文件的类型、目录和名字 定制定制RAM模块的数据宽度和深度模块的数据宽度和深度 指定指定RAM模块的初始化数据文件模块的初始化数据文件 【例例7.46】 用文本方式调用用文本方式调用RA
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论