




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章
Verilog设计的层次与风格主要内容◆结构(Structural)描述◆行为(Behavioural)描述◆数据流(DataFlow)描述◆基本组合电路设计◆基本时序电路设计Verilog设计的描述风格
结构(Structural)描述(4/5)行为(Behavioural)描述
数据流(DataFlow)描述7.1Verilog设计的层次VerilogHDL是一种能够在多个层级对数字系统进行描述的语言,VerilogHDL模型可以是实际电路不同级别的抽象。这些抽象级别可分为5级。(1)系统级(SystemLevel)(2)算法级(AlgorithmLevel)(3)寄存器传输级(RTL,RegisterTransferLevel)(4)门级(GateLevel)(5)开关级(SwitchLevel)-基于晶体管的设计层次高级别结构描述是调用电路元件来构建电路:在Verilog程序中可通过如下方式描述电路的结构◆调用Verilog内置门元件(门级结构描述)◆调用开关级元件(晶体管级结构描述)◆用户自定义元件UDP(也在门级)-Chapter11◆多层次结构电路的设计中,不同模块间的调用也属结构描述-7.67.2结构(Structural)描述
Verilog的内置门元件其真值表见P168
门元件的调用调用门元件的格式为:门元件名字<例化的门名字>(<端口列表>)其中普通门的端口列表按下面的顺序列出:(输出,输入1,输入2,输入3……);比如:anda1(out,in1,in2,in3); //三输入与门对于三态门,则按如下顺序列出输入输出端口:(输出,输入,使能控制端);比如:bufif1mytri1(out,in,enable); //高电平使能的三态门门元件的调用对于buf和not两种元件的调用,需注意的是:它们允许有多个输出,但只能有一个输入。比如:
notN1(out1,out2,in); //1个输入in,2个输出out1,out2bufB1(out1,out2,out3,in); //1个输入in,3个输出out1,out2,out3【例7.1】调用门元件实现的4选1MUXmodulemux4_1a(out,in1,in2,in3,in4,s0,s1);inputin1,in2,in3,in4,s0,s1;outputout;wires0_n,s1_n,w,x,y,z;not(s0_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选1MUX原理图7.3行为描述
就是对设计实体的数学模型的描述,其抽象程度远高于结构描述方式。行为描述类似于高级编程语言,当描述一个设计实体的行为时,无需知道具体电路的结构,只需要描述清楚输入与输出信号的行为,而不需要花费更多的精力关注设计功能的门级实现。【例7.2】用case语句描述的4选1MUXmodulemux4_1b(out,in1,in2,in3,in4,s0,s1);inputin1,in2,in3,in4,s0,s1;outputregout;always@(*) //使用通配符case({s0,s1})2'b00:out=in1;2'b01:out=in2;2'b10:out=in3;2'b11:out=in4;default:out=2'bx;endcaseendmoduleP111例4.12【例7.3】4位二进制加法计数器modulecount4(out,clr,clk);inputclr,clk;outputreg[3:0]out;always@(posedgeclkorposedgeclr)beginif(clr) out<=0;//异步清零else out<=out+1; //计数endendmodule采用行为描述方式时需注意用行为描述模式设计电路,可以降低设计难度。行为描述只需表示输入与输出之间的关系,不需要包含任何结构方面的信息。设计者只需写出源程序,而挑选电路方案的工作由EDA软件自动完成。在电路的规模较大或者需要描述复杂的逻辑关系时,应首先考虑用行为描述方式设计电路,如果设计的结果不能满足资源占有率的要求,则应改变描述方式。7.4数据流描述
数据流描述方式主要使用持续赋值语句,多用于描述组合逻辑电路,其格式为:
assignLHS_net=RHS_expression;右边表达式中的操作数无论何时发生变化,都会引起表达式值的重新计算,并将重新计算后的值赋予左边表达式的net型变量。【例7.4】数据流描述的4选1MUXmodulemux4_1c(out,in1,in2,in3,in4,s0,s1);inputin1,in2,in3,in4,s0,s1;outputout;assignout=(in1&~s0&~s1)|(in2&~s0&s1)|(in3&s0&~s1)|(in4&s0&s1);endmodule
数据流描述
用数据流描述方式设计电路与用传统的逻辑方程设计电路很相似。设计中只要有了布尔代数表达式就很容易将它用数据流方式表达出来。表达方法是用Verilog中的逻辑运算符置换布尔逻辑运算符即可。比如,如果逻辑表达式为:,则用数据流方式描述为:assignF=(a&b)|(~(c&d))。7.5不同描述风格的设计
对设计者而言,采用的描述级别越高,设计越容易;对综合器而言,行为级的描述为综合器的优化提供了更大的空间,较之门级结构描述更能发挥综合器的性能,所以在电路设计中,除非一些关键路径的设计采用门级结构描述外,一般更多地采用行为建模方式。
【例7.12】调用门元件实现的1位全加器
modulefull_add1(a,b,cin,sum,cout);inputa,b,cin;outputsum,cout;wires1,m1,m2,m3;and(m1,a,b),(m2,b,cin),(m3,a,cin);xor(s1,a,b),(sum,s1,cin);or(cout,m1,m2,m3);endmodule【例7.13】数据流描述的1位全加器modulefull_add2(a,b,cin,sum,cout);inputa,b,cin;outputsum,cout;assignsum=a^b^cin;assigncout=(a&b)|(b&cin)|(cin&a);endmodule3、行为描述的1位全加器【例7.14】行为描述的1位全加器modulefull_add3(a,b,cin,sum,cout);inputa,b,cin;outputregsum,cout;always@*
//或写为always@(aorborcin)begin{cout,sum}=a+b+cin;endendmodule4、采用层次化方式设计1位全加器两个半加器构成一个全加器:半加器为底层模块,全加器为顶层模块,在顶层模块中调用底层模块(模块例化)来构成整个系统,类似在原理图设计中调用元器件。【例7.15】用模块例化方式设计的1位全加器顶层设计modulefull_add(ain,bin,cin,sum,cout);inputain,bin,cin;outputsum,cout;wired,e,f; //用于内部连接的节点信号half_addu1(ain,bin,e,d); //半加器模块调用,采用位置关联方式half_addu2(e,cin,sum,f);oru3(cout,d,f); //或门调用endmodule【例7.16】半加器定义modulehalf_add(a,b,so,co);inputa,b;outputso,co;assignco=a&b;assignso=a^b;endmodule4位加法器设计moduleadd4_1(sum,cout,a,b,cin);output[3:0]sum;outputcout;input[3:0]a,b;inputcin;
/*级连描述,full_add1源代码见例7.12*/full_add1f0(a[0],b[0],cin,sum[0],cin1);full_add1f1(a[1],b[1],cin1,sum[1],cin2);full_add1f2(a[2],b[2],cin2,sum[2],cin3);full_add1f3(a[3],b[3],cin3,sum[3],cout);endmodule结构描述的4位级连全加器【例7.18】数据流描述的4位加法器moduleadd4_2(cout,sum,a,b,cin);inputcin;input[3:0]a,b;output[3:0]sum;outputcout;assign{cout,sum}=a+b+cin;endmodule7.6多层次结构电路的设计如果数字系统比较复杂,可采用“Top-down”的方法进行设计。首先把系统分为几个模块,每个模块再分为几个子模块,以此类推,直到易于实现为止。这种“Top-down”的方法能够把复杂的设计分解为许多简单的逻辑来实现,同时也适合于多人进行分工合作,如同用C语言编写大型软件一样。Verilog语言能够很好地支持这种“Top-down”的设计方法。
1.2.1Top-down设计举例:
数字频率计组成原理框图Moduleplj(clk,rst,signal,out);7.6多层次结构电路的设计多层次结构电路的描述既可以采用文本方式,也可以用图形和文本混合设计的方式。用一个8位累加器的设计为例来说明这两种设计方式。1.图形与文本混合设计
8位全加器moduleadd8(sum,cout,b,a,cin);output[7:0]sum;outputcout;input[7:0]a,b;inputcin;assign{cout,sum}=a+b+cin;endmodule8位寄存器modulereg8(qout,in,clk,clear);output[7:0]qout;input[7:0]in;inputclk,clear;reg[7:0]qout;always@(posedgeclkorposedgeclear)beginif(clear)qout<=0; //异步清0elseqout<=in;endendmodule将设计项目设置成可调用的元件将所需元件全部调入原理图编辑窗并连接好
顶层acc.bdfadd8.bsfreg8.bsf底层
add8.vreg8.v
2.文本设计moduleacc(accout,cout,accin,cin,clk,clear);output[7:0]accout;outputcout;input[7:0]accin;inputcin,clk,clear;wire[7:0]sum;add8accadd8(sum,cout,accout,accin,cin); //调用add8子模块reg8accreg8(accout,sum,clk,clear); //调用reg8子模块endmodule累加器顶层文本描述对于上面的模块调用,可采用位置对应的方式,即调用时模块端口列表中信号的排列顺序与模块定义时端口列表中的信号排列顺序相同;也可以采用信号名对应方式,此时不必按顺序,例如上面对reg8的调用:modulereg8(qout,in,clk,clear); //reg8的模块声明—底层reg8accreg8(accout,sum,clk,clear); //调用方式1,位置对应—顶层reg8accreg8(.qout(accout),.clear(clear),.in(sum),.clk(clk)); //调用方式2,信号名对应—顶层模块调用-和所用的综合器有关2.文本设计-模块调用的指定方式(1)文件复制方式:将add8和reg8的代码复制到acc.v中,在综合时指明顶层模块。
moduleacc(accout,cout,accin,cin,clk,clear);output[7:0]accout;outputcout;input[7:0]accin;inputcin,clk,clear;wire[7:0]sum;add8accadd8(sum,cout,accout,accin,cin); //调用add8子模块reg8accreg8(accout,sum,clk,clear); //调用reg8子模块endmodule
moduleadd8(sum,cout,b,a,cin);output[7:0]sum;outputcout;input[7:0]a,b;inputcin;assign{cout,sum}=a+b+cin;endmodule………………2.文本设计-模块调用的指定方式(2)库管理方式7.7基本组合电路(CombinationalLogicCircuit)设计门级结构描述
modulegate1(F,A,B,C,D);inputA,B,C,D;outputF;nand(F1,A,B);//调用门元件and(F2,B,C,D);or(F,F1,F2);endmodule数据流描述modulegate2(F,A,B,C,D);inputA,B,C,D;outputF;assignF=(~(A&B))|(B&C&D);endmodule1、3-8译码器(Decoder)【例7.24】74138的Verilog描述modulettl74138(a,y,g1,g2a,g2b);input[2:0]a;inputg1,g2a,g2b;outputreg[7:0]y;always@(*)beginif(g1&~g2a&~g2b) //只有当g1、g2a、g2b为100时,译码器使能begincase(a)3'b000:y=8'b11111110; //译码输出3'b001:y=8'b11111101;3'b010:y=8'b11111011;3'b011:y=8'b11110111;3'b100:y=8'b11101111;3'b101:y=8'b11011111;3'b110:y=8'b10111111;3'b111:y=8'b01111111;default:y=8'b11111111;endcaseendelsey=8'b11111111;endendmodule3-8译码器(Decoder)Maxplus2库—74138Primitives(原语)库
缓冲器buffer
逻辑门logic--nand
其他功能other—gnd,vcc
引脚pin—input,output
存储单元storage2、8-3(PriorityEncoder)【例7.25】8线—3线优先编码器74148的Verilog描述modulettl74148(din,ei,gs,eo,dout);input[7:0]din;inputei;outputreggs,eo;outputreg[2:0]dout;always@(ei,din)beginif(ei)begindout<=3'b111;gs<=1'b1;eo<=1'b1;endelseif(din==8'b111111111)begindout<=3'b111;gs<=1'b1;eo<=1'b0;endelseif(!din[7])begindout<=3'b000;gs<=1'b0;eo<=1'b1;endelseif(!din[6])begindout<=3'b001;gs<=1'b0;eo<=1'b1;endelseif(!din[5])begindout<=3'b010;gs<=1'b0;eo<=1'b1;endelseif(!din[4])begindout<=3'b011;gs<=1'b0;eo<=1'b1;endelseif(!din[3])begindout<=3'b100;gs<=1'b0;eo<=1'b1;endelseif(!din[2])begindout<=3'b101;gs<=1'b0;eo<=1'b1;endelseif(!din[1])begindout<=3'b110;gs<=1'b0;eo<=1'b1;endelsebegindout<=3'b111;gs<=1'b0;eo<=1'b1;endendendmodule2、8-3(PriorityEncoder)【例7.26】用函数定义的8线—3线优先编码器74148的Verilog描述modulecoder83(din,dout);input[7:0]din;output[2:0]dout;function[2:0]code;//函数定义input[7:0]din;//函数只有输入端口,输出为函数名本身if(din[7])code=3'd7;elseif(din[6])code=3'd6;elseif(din[5])code=3'd5;elseif(din[4])code=3'd4;elseif(din[3])code=3'd3;elseif(din[2])code=3'd2;elseif(din[1])code=3'd1;elsecode=3'd0;endfunctionassigndout=code(din);//函数调用endmodule在使用函数时,需注意1、函数的定义与调用须在一个module模块内。
2、函数只允许有输入变量且必须至少有一个输入变量,输出变量由函数名本身担任,在定义函数时,需对函数名说明其类型和位宽。
3、定义函数时,没有端口名列表,但调用函数时,需列出端口名列表,端口名的排序和类型必须与定义时的相一致。这一点与任务相同
4、函数可以出现在持续赋值assign的右端表达式中。
5、函数不能调用任务,而任务可以调用别的任务和函数,且调用任务和函数个数不受限制。3、奇偶校验(ParityCheck)位产生器【例7.27】奇偶校验位产生器moduleparity(even_bit,odd_bit,a);input[7:0]a;outputeven_bit,odd_bit;assigneven_bit=^a; //生成偶校验位assignodd_bit=~even_bit; //生成奇校验位endmodule7.8
基本时序电路设计【例7.29】带异步清0/异步置1的JK触发器modulejkff_rs(clk,j,k,q,rs,set);inputclk,j,k,set,rs;outputregq;always@(posedgeclk,negedgers,negedgeset)beginif(!rs)q<=1'b0;elseif(!set)q<=1'b1;elsecase({j,k})2'b00:q<=q;2'b01:q<=1'b0;2'b10:q<=1'b1;2'b11:q<=~q;default:q<=1'bx;endcaseendendmodule锁存器(latch)【例7.30】电平敏感的1位数据锁存器modulelatch1(q,d,le);inputd,le;outputq;assignq=le?d:q; //le为高电平时,将输入端数据锁存endmodule锁存器(latch)【例7.31】带置位/复位端的1位数据锁存器modulelatch2(q,d,le,set,reset);inputd,le,set,reset;outputq;assignq=reset?0:(set?1:(le?d:q));endmodule锁存器(latch)【例7.32】8位数据锁存器(74LS373)modulettl373(le,oe,q,d);inputle,oe;input[7:0]d;outputreg[7:0]q;always@* //或写为always@(le,oe,d)beginif(~oe&le)q<=d; //或写为if((!oe)&&(le))elseq<=8'bz;endendmodule3.4.6
存储器模块(storage)P89参数化锁存器lpm_latch数据寄存器(register)【例7.33】数据寄存器modulereg_w(dout,din,clk,clr);parameterWIDTH=7;inputclk,clr;input[WIDTH:0]din;outputreg[WIDTH:0]dout;always@(posedgeclk,posedgeclr)beginif(clr)dout<=0;elsedout<=din;endendmodule数据锁存器与数据寄存器-P183数据锁存器(latch)与数据寄存器(register)的区别:(1)Latch:一般由电平信号控制,属于电平敏感型;Register:一般由时钟信号控制,属于边沿敏感型。(2)有不同的使用场合,主要取决于控制方式及控制信号和数据信号之间的时序关系:若数据有效滞后于控制信号有效,则只能用锁存器;若数据提前于控制信号,并要求同步操作,则可以选择寄存器来存放数据。8位移位寄存器-P183【例7.34】8位移位寄存器moduleshift8(dout,din,clk,clr);inputclk,clr,din;outputreg[7:0]dout;always@(posedgeclk)beginif(clr)dout<=8‘b0;//同步清0,高电平有效elsebegindout<=dout<<1;//输出信号左移一位
dout[0]<=din;//输入信号补充到输出信号的最低位
endendendmodule计数器【例7.35】可变模加法/减法计数器moduleupdown_count(d,clk,clear,load,up_down,qd);inputclk,clear,load,up_down;input[7:0]d;output[7:0]qd;reg[7:0]cnt;assignqd=cnt;always@(posedgeclk)beginif(!clear) cnt<=8'h00; //同步清0,低电平有效elseif(load) cnt<=d; //同步预置elseif(up_down) cnt<=cnt+1; //加法计数else cnt<=cnt-1; //减法计数endendmodule7.9三态逻辑设计
【例7.39】行为描述的三态门moduletristate1(in,en,out);inputin,en;outputregout;always@(inoren)beginif(en)out<=in;elseout<=1'bz;endendmodule【例7.40】调用门元件bufif1描述的三态门moduletristate2(in,en,out);inputin,en;outputout;triout;bufif1b1(out,in,en); //注意三态门端口的排列顺序endmodule【例7.41】数据流描述的三态门moduletristate3(out,in,en);inputin,en;outputout;assignout=en?in:1‘bz; //若en=1,out=in; //若en=0,out为高阻态endmodule【例7.42】三态双向驱动器modulebidir(y,a,en,b);inputa,en;outputb;inouty;assigny=en?a:'bz;assignb=y;endmodule【例7.44】三态双向总线缓冲器modulettl245(a,b,oe,dir);inputoe,dir; //使能信号和方向控制inout[7:0]a,b; //双向数据线assigna=({oe,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国汽车用铅酸蓄电池行业市场运营现状及投资规划研究建议报告
- 信息技术-通信行业行业深度报告:太空算力:打破传统地天观重构天基智能版图
- 健康牙齿课件
- 2025年高等教育数字化研究分析报告
- 营销管理部内部管理办法
- 蔡甸区湿地公园管理办法
- 蚌埠市街区经营管理办法
- 证监会融资融券管理办法
- 衢江区土地整治管理办法
- 规划及计划管理暂行办法
- MOOC 高等数学先修课-西南财经大学 中国大学慕课答案
- GB/T 29319-2024光伏发电系统接入配电网技术规定
- 运行人员电气培训课件
- 2024陕西延长石油集团矿业公司所属单位社会招聘笔试参考题库附带答案详解
- 直流微电网下垂控制技术研究综述
- 2024年高考数学复习备考策略讲座
- 髓母细胞瘤护理课件
- 《责任制整体护理》培训课件
- 针灸治疗脾胃病
- 膨胀剂检测报告
- 2023中智集团总部及下属企业公开招聘4人上岸笔试历年难、易错点考题附带参考答案与详解
评论
0/150
提交评论