为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

PPT课件----西电出版社《Verilog HDL数字设计教程》 第3章 Verilog HDL常用建模方法

2019-09-19 47页 ppt 398KB 17阅读

用户头像 个人认证

科技制造的艺术美

暂无简介

举报
PPT课件----西电出版社《Verilog HDL数字设计教程》 第3章 Verilog HDL常用建模方法第3章VerilogHDL常用建模方法 3.1建模方法引例 3.2结构化形式建模 3.3数据流级建模 3.4行为级建模 3.5小结3.1建模方法引例【例3-1】设计实现一个3人判决电路,当3个人中有2人或者超过2个人同意,则表决结果为通过;否则表决结果不通过。3.1建模方法引例 第一步:理解题意设a,b,c分别代表3个人,同意用1表示,不同意用0表示,y代表表决结果,1表示通过,0表示不通过。根据题意有,当a,b,c三个中有2个为1,或者3个均为1时,y为1,否则y为0。 第二步:根据题意,列真值表3.1建模方法引例 第三步:...
PPT课件----西电出版社《Verilog HDL数字设计教程》 第3章 Verilog HDL常用建模方法
第3章VerilogHDL常用建模方法 3.1建模方法引例 3.2结构化形式建模 3.3数据流级建模 3.4行为级建模 3.5小结3.1建模方法引例【例3-1】设计实现一个3人判决电路,当3个人中有2人或者超过2个人同意,则决结果为通过;否则表决结果不通过。3.1建模方法引例 第一步:理解题意设a,b,c分别代表3个人,同意用1表示,不同意用0表示,y代表表决结果,1表示通过,0表示不通过。根据题意有,当a,b,c三个中有2个为1,或者3个均为1时,y为1,否则y为0。 第二步:根据题意,列真值表3.1建模方法引例 第三步:根据真值表,列输出方程: y=a'bc+ab'c+abc'+abc 第四步:化简方程,可以采用代数化简法或者卡诺图化简法 化简后的方程为:y=ab+bc+ca3.1建模方法引例 第五步:根据化简后的方程画出电路图3.1建模方法引例【例3-2】对应于步骤一的Verilog建模moduledecision_1(a,b,c,y);inputa,b,c;outputregy;always@(a,b,c) if((a&b==1)|(b&c==1)|(c&a==1)|(a&b&c==1))y=1; elsey=0;endmodule3.1建模方法引例【例3-3】对应于步骤二的Verilog建模moduledecision_2(a,b,c,y);inputa,b,c;outputregy;always@(a,b,c) case({a,b,c}) 3'b000:y=0; 3'b001:y=0; 3'b010:y=0; 3'b011:y=1; 3'b100:y=0; 3'b101:y=1; 3'b110:y=1; 3'b111:y=1; endcaseendmodule3.1建模方法引例【例3-4】对应于步骤三的Verilog建模moduledecision_3(a,b,c,y);inputa,b,c;outputy;assigny=(~a&b&c)|(a&~b&c)|(a&b&~c)|(a&b&c);endmodule3.1建模方法引例【例3-5】对应于步骤四的Verilog建模moduledecision_4(a,b,c,y);inputa,b,c;outputy;assigny=(a&b)|(b&c)|(c&a);endmodule3.1建模方法引例【例3-6】对应于步骤五的Verilog建模moduledecision_5(a,b,c,y);inputa,b,c;outputy;//assigny=(a&b)+(b&c)+(c&a);//assigny=a&b+b&c;and(ab,a,b),(bc,b,c),(ca,c,a);or(y,ab,bc,ca);endmodule3.1建模方法引例图3-6功能仿真波形3.2结构化形式建模 1.门级建模 2.用户自定义原语门级建模 (1)与/或门类 (2)缓冲/非门类门级建模【例3-7】利用双输入端的nand门,编写自己与门(my_and)、或门(my_or)、非门(my_not)、异或门(my_xor)。modulemy_and(a,b,y);//用两个nand门inputa,b;outputy;wirenandab;nand(nandab,a,b),(y,nandab,nandab);endmodulemodulemy_or(a,b,y);//用三个nand门inputa,b;outputy;wirenandaa,nandbb;nand(nandaa,a,a),(nandbb,b,b),(y,nandaa,nandbb);endmodulemodulemy_not(a,y);//用一个nand门inputa;outputy;nand(y,a,a);endmodulemodulemy_xor(a,b,y);//用四个nand门实现异或门inputa,b;outputy;wireandab,c,d;nand(andab,a,b), (c,andab,a), (d,andab,b), (y,c,d);endmodule用户自定义原语【例3-8】表示组合逻辑的UDP举例:一位全加器//全加器进位实现部分primitiveU_ADD_C(CO,A,B,CI);outputCO;inputA,B,CI;table//ABCI:CO11?:1;1?1:1;?11:1;00?:0;0?0:0;?00:0;endtableendprimitive//全加器求和实现部分primitiveU_ADD_S(S,A,B,CI);outputS;inputA,B,CI;table//ABCI:S000:0;001:1;010:1;011:0;100:1;101:0;110:0;111:1;endtableendprimitive用户自定义原语//调用上述两个UDP的全加器模块moduleU_ADD(SUM,CO,a,b,ci);inputa,b,ci;outputSUM,CO;U_ADD_SU1(SUM,a,b,ci);U_ADD_CU2(CO,a,b,ci);endmodule用户自定义原语【例3-9】表示时序逻辑的UDP举例:D触发器primitived_edge_ff(q,clk,data);outputq;inputclk,data;regq;table//clkdatstatenext (01)0:?:0; (01)1:?:1;//时钟下降沿 (?0)?:?:-;//时钟稳定时忽略data变化 ?(??):?:-;endtableendprimitive3.3数据流级建模 1.连续赋值语句 2.运算符类型连续赋值语句【例3-10】使用数据流建模,实现一位半加器。moduleadder_half(ain,bin,sum,co);inputain,bin;outputsum,co;assign{co,sum}=ain+bin;endmodule运算符类型算术运算符【例3-11】算术运算符示例modulearith(a,b,add,sub,mul,div,mod,pow);input[7:0]a,b;output[7:0]add,sub,mul,div,mod,pow;assign add=a+b, sub=a-b, mul=a*b, div=a/b, mod=a%b, pow=a**4;endmodule关系运算符关系运算符包括:大于(>)、小于(<)、大于等于(>=)、小于等于(<=)、等于(==)、不等于(!==)。逻辑运算符按位运算符缩减运算符 缩减运算符包括:缩减与(&)、缩减与非(~&)、缩减或(|)、缩减或非(~|)、缩减异或(^)、缩减同或(~^,^~)。 缩减运算符是单目运算符,也有与、或、非运算。其与、或、非运算规则类似于位运算符的与、或、非运算规则,但其运算过程不同。条件运算符【例3-12】试用条件运算符来实现一个四选一多路选择器。modulemux4to1(out,condition1,condition2,in1,in2,in3,in4);outputout;inputin1,in2,in3,in4;inputcondition1,condition2;assignout=(condition1)?(condition2?in1:in2):(condition2?in3:in4);endmodule移位运算符【例3-13】采用移位运算符实现两个3位数的乘法。modulemul_3bit(a,b,mul);input[2:0]a,b;output[5:0]mul;wire[5:0]mul1,mul2,mul3;assignmul=mul3;assignmul1=b[0]?a:0;assignmul2=b[1]?(mul1+(a<<1)):mul1;assignmul3=b[2]?(mul2+(a<<2)):mul2;endmodulea2a1a0b2b1b0xa2b0a1b0a0b0a2b1a1b1a0b1a2b2a1b2a0b2第1行第2行第3行第1列第2列第3列第4列第5列位拼接运算符{a,b[3:0],w,3’b101}//等价于{a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}{1,1}//64位,从右边数第0位为1,第32位为1,其余位均为0{4{w}}//等价于{w,w,w,w}{b,{3{a,b}}}//等价于{b,a,b,a,b,a,b}优先级别3.4行为级建模 1.结构化过程语句always 2.过程赋值语句 3.块语句 4.条件语句 5.多路分支语句 6.循环语句 7.任务和函数语句结构化过程语句always【例3-15】使用always语句描述D触发器modulemydff(q,clk,d);inputclk,d;outputq;regq;always@(posedgeclk)q<=d;endmodule过程赋值语句【例3-16】阻塞赋值方式描述的移位寄存器1moduleblock1(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin//注意赋值语句的顺序 Q2=Q1; Q1=Q0; Q0=D;endendmodule过程赋值语句【例3-17】阻塞赋值方式描述的移位寄存器2moduleblock2(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin//该句与下句的顺序与例3-16颠倒 Q1=Q0; Q2=Q1; Q0=D;endendmodule过程赋值语句【例3-18】阻塞赋值方式描述的移位寄存器3moduleblock3(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin Q0=D;//3条赋值语句的顺序与例3-16完全颠倒 Q1=Q0; Q2=Q1;endendmodule过程赋值语句【例3-19】非阻塞赋值方式描述的移位寄存器1modulenon_block1(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin Q1<=Q0; Q2<=Q1; Q0<=D;endendmodule【例3-20】非阻塞赋值方式描述的移位寄存器2modulenon_block2(Q0,Q1,Q2,D,clk);outputQ0,Q1,Q2;inputclk,D;regQ0,Q1,Q2;always@(posedgeclk)begin Q0<=D;//3条赋值语句的顺序与例3-19完全颠倒 Q2<=Q1; Q1<=Q0;endendmodule块语句【例3-21】完成以下两个功能:(1)使用异或运算符对D完成缩位异或运算;(2)检测D中1的个数Verilog实现代码如下:modulenamed_block(D,xnor_D,CountOnes);input[3:0]D;outputregxnor_D;outputreg[2:0]CountOnes;always@(D)begin:block1 xnor_D=0; CountOnes=0; begin:xor_block integerI; for(I=0;I<4;I=I+1) xnor_D=xnor_D^D[I]; end//循环 begin:Count_block integerJ; for(J=0;J<4;J=J+1) if(D[J]) CountOnes=CountOnes+1; endendendmodule条件语句【例3-22】使用always语句描述具有同步复位和同步置位功能的D触发器modulemydff(q,clk,set,clr,d);inputclk,d,set,clr;outputq;regq;always@(posedgeclk)beginif(set)q<=1;elseif(!clr)q<=0;elseq<=d;endendmodule多路分支语句【例3-23】使用case语句实现四功能的算术逻辑单元(ALU)modulealu_4fun(a,b,sel,out);input[3:0]a,b;input[1:0]sel;outputreg[4:0]out;always@(a,b,sel)begin case(sel) 2'b00:out=a+b; 2'b01:out=a-b; 2'b10:out=a<<b; default:out=a%b; endcaseendendmodule循环语句【例3-24】使用repeat循环语句及加法和移位操作来实现一个参数化的多位乘法器。modulemult_repeat(result,op_a,op_b);parametersize=4;input[size:1]op_a,op_b;output[2*size:1]result;reg[2*size:1]shift_opa,result;reg[size:1]shift_opb;always@(op_aorop_b)begin:multresult=0;shift_opa=op_a;shift_opb=op_b;repeat(size)beginif(shift_opb[1])result=result+shift_opa;shift_opa=shift_opa<<1;//Shiftleftshift_opb=shift_opb>>1;//Shiftrightendendendmodule循环语句【例3-25】使用for循环语句实现一个参数化的多位乘法器。modulemult_for(result,op_a,op_b);parametersize=4;input[size:1]op_a,op_b;output[2*size:1]result;reg[2*size:1]shift_opa,result;reg[size:1]shift_opb;always@(op_aorop_b)begin:mult//由于块中定义了局部变量i,此处必须给块命名 integeri=0;result=0;shift_opa=op_a;shift_opb=op_b;for(i=0;i<size;i=i+1)beginif(shift_opb[1])result=result+shift_opa;shift_opa=shift_opa<<1;//Shiftleftshift_opb=shift_opb>>1;//Shiftrightendendendmodule循环语句【例3-26】使用for循环语句实现一个参数化的多位乘法器的另一种算法。modulemult_for2(result,op_a,op_b);parametersize=4;input[size:1]op_a,op_b;output[2*size:1]result;reg[2*size:1]shift_opa,result;reg[size:1]shift_opb;always@(op_aorop_b)begin:mult integerj; result=0; for(j=1;j<=size;j=j+1) if(op_b[j]) result=result+(op_a<<(j-1));endendmodule循环语句【例3-27】使用for循环语句对变量中的1的位进行计数的程序片断begin:count1sreg[7:0]tempreg;count=0;for(tempreg=rega;tempreg;tempreg=tempreg>>1)if(tempreg[0])count=count+1;end任务和函数语句【例3-28】用任务实现输入数据按位逆序后输出的功能Verilog实现代码如下:module task_ex(clk,D,Q);inputclk;input[MAX_BITS:1]D;outputreg[MAX_BITS:1]Q;parameterMAX_BITS=8;taskreverse_bits;input[MAX_BITS:1]data;output[MAX_BITS:1]result;integerK;for(K=0;K<MAX_BITS;K=K+1) result[MAX_BITS-K]=data[K+1];endtaskalways@(posedgeclk) reverse_bits(D,Q);endmodule任务和函数语句【例3-29】用函数实现输入数据位逆序后输出的功能Verilog实现代码如下:module function_ex(clk,D,Q);inputclk;input[MAX_BITS:1]D;outputreg[MAX_BITS:1]Q;parameterMAX_BITS=8;function[MAX_BITS:1]reverse_bits; input[MAX_BITS:1]data;integerK;for(K=0;K<MAX_BITS;K=K+1) reverse_bits[MAX_BITS-K]=data[K+1];endfunctionalways@(posedgeclk) Q<=reverse_bits(D);endmodule3.5小结在本章,我们讨论了以下知识点: 本章从一个典型数字电路实例入手来引入建模方法,介绍VerilogHDL的常用建模方法,并重点介绍门级建模、数据流级建模和行为级建模方法。 门的基本类型包括与门(and)、或门(or)、与非门(nand)、或非门(nor)、异或门(xor)、同或门(xnor)、缓冲器(buf)和非门(not)等。每种门都有逻辑符号、真值表和对应的verilog原语。这些原语的调用方法和模块的调用方法一样,但这些原语是verilog语言预定义的(不需要自行编写)。门的任意一个输入发生变化以后,门的输出立即被重新计算。 连续赋值语句是数据流建模的主要语法结构。连续赋值语句总是处于有效状态,即任一操作数的变化都会立即导致对表达式的重新计算。连续赋值语句的左侧必须是线网类型的变量或者拼接。任何逻辑功能都能够使用连续赋值语句来完成。3.5小结 运算符的类型包括算术、关系、逻辑、按位、缩减、条件、移位和位拼接运算符。单目、双目和三目运算符分别具有一个、两个和三个操作数,而拼接运算符可以具有任意多个操作数。 由于运算符的优先级被忽视或混淆而造成错误的情况经常发生。为了避免源于运算符优先级的运算错误,在不确定运算符优先级的情况下,建议读者使用小括号将各个表达式分开。另外,使用括号也可以提高程序的可读性,明确表达各运算符间的优先关系。 电路的门级描述、数据流描述、行为描述,抽象层次越来越高,但也越来越接近人的思维,方便设计者高效准确的进行系统设计。 利用任务和函数可以把一个很大的程序模块分解成许多较小的任务和函数,这样便于理解和调试。VeirlogHDL函数和任务在综合时被理解成具有独立运算功能的电路,每调用一次函数相当于改变这部分电路的输入以得到相应的计算结果。学会使用task和function语句可以简化程序的结构,使程序明白易懂,是编写较大型模块的基本功。 P79T1、2、3、4、5、6、7、8、9、10、11作业
/
本文档为【PPT课件----西电出版社《Verilog HDL数字设计教程》 第3章 Verilog HDL常用建模方法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索