您好,欢迎访问三七文档
当前位置:首页 > 高等教育 > 语言学 > 硬件描算语言chapter3
第3章VerilogHDL数据流描述和运算符8/13/20201MicroelectronicsSchoolXidianUniversity3.1连续赋值语句(assign)数据流建模:通过连续赋值语句和运算符的建模方式。显式连续赋值语句net_declarationrangename;assign#delayname=assignmentexpression;moduleexample1_assignment(a,b,m,n,c,y);input[3:0]a,b,m,n;output[3:0]c,y;wire[3:0]a,b,m,n,c,y;assigny=m|n;assignc=a&b;endmodule8/13/20203MicroelectronicsSchoolXidianUniversity隐式连续赋值语句net_declarationdrive_strengthrange#delayname=assignmentexpression;moduleexample2_assignment(a,b,m,n,c,y,w);input[3:0]a,b,m,n;6output[3:0]c,y,w;wire[3:0]a,b,m,n;wire[3:0]y=m|n;wire[3:0]#(3,2,4)c=a&b;wire(strong0,weak1)[3:0]#(2,1,3)w=(a^b)&(m^n);endmodule例程8/13/20204MicroelectronicsSchoolXidianUniversity例3.1-3:数据流描述设计1bit全加器moduleadder1(out,a,b,cin);inputa,b;inputcin;outputout;assignout=a+b+cin;endmodule例3.1-4:数据流描述设计4bits全加器moduleadder4(cout,sum,cin,a,b);inputcin;input[3:0]a,b;outputcout;output[3:0]sum;wirecout,cin;wire[3:0]a,b,sum;assign{cout,sum}=a+b+cin;endmodule例3.1-5:数据流描述设计16bits全加器moduleadder16(cout,sum,cin,a,b);inputcin;input[15:0]a,b;outputcout;output[15:0]sum;assign{cout,sum}=a+b+cin;endmodule连续赋值语句使用中的注意事项8/13/20205MicroelectronicsSchoolXidianUniversity(1)赋值目标只能是线网类型(wire),或者是标量或向量线网的拼接,而不能是标量或向量寄存器;(2)连续赋值语句总是处于激活在连续赋值中,只要赋值语句右边表达式任何一个变量有变化,表达式立即被计算,计算的结果立即赋给左边信号(若没有定义延时量);(3)连续赋值语句不能出现在过程块中;(4)多个连续赋值语句之间是并行关系,因此与位置顺序无关;(5)连续赋值语句中的延时具有硬件电路中惯性延时的特性,任何小于其延时的信号变化脉冲都将被滤除掉,不会出现在输出端口上。3.2VerilogHDL中的运算符8/13/20206MicroelectronicsSchoolXidianUniversity运算符功能优先级别!、~反逻辑、位反相高低*、/、%乘、除、取模+、-加、减、左移、右移、=、、=小于、小于等于、大于、大于等于==、!=、===、!==等、不等、全等、非全等&按位与^、^~按位逻辑异或和同或|按位逻辑或&&逻辑与||逻辑或?:条件运算符,唯一的三目运算符,等于if-else3.2.1算术运算符+、—、*、\、%8/13/20207MicroelectronicsSchoolXidianUniversitymoduleadd_operation(A,B,C,D);input[3:0]B,C;output[3:0]A;output[5:0]D;assignA=B+C;assignD=B+C;endmodule在赋值语句下,算术操作结果的长度由操作左端的目标长度决定modulemultiplier(a,b,product);input[7:0]a,b;output[15:0]product;assignproduct=a*b;endmodule8*8的乘法器moduleSignedAdder(A,C);input[2:0]A;output[2:0]C;reg[2:0]SignedTemp;reg[2:0]C;assignSignedTemp=-A;//语句[1]assignC=SignedTemp+1;//语句[2]endmoduleA[2:0]A[32:0]B[32:0]OUT[32:0]A[31:0]B[31:0]OUT[31:0]C[2:0]ADDERADDERadd~0add~13.2.2关系运算符及相等运算符8/13/20208MicroelectronicsSchoolXidianUniversity关系运算符:、、=和=相等关系运算符:==、!=、===和!==(a)“==”运算符的真值表==01xz010xx101xxxxxxxzxxxx(b)“===”运算符的真值表===01xz0100010100x0010z0001应该注意的是,关系运算的结果是一个1bit信号8/13/20209MicroelectronicsSchoolXidianUniversity例3.2-4:用VerilogHDL关系运算符描述比较器程序(1)moduleRelationalOperation(A,B,C);input[1:0]A;input[2:0]B;outputC;regC;always@(AorB)C=AB;endmodule程序(2)moduleRelationalOperation(A,B,C);input[1:0]A;input[2:0]B;outputC;regC;always@(AorB)if(AB)C=1;elseC=0;endmoduleB[2:0]A[2:0]B[2:0]OUTCA[1:0]8/13/202010MicroelectronicsSchoolXidianUniversitymodulecomparator(a,b,agb,aeb,alb);parameterwidth=4;//通过配置参数width来调节比较器的位宽input[1:0]a,b;outputagb;//若ab,该输出信号有效outputaeb;//若a==b,该输出信号有效outputalb;//若ab,该输出信号有效assignagb=(ab);assignaeb=(a==b);assignalb=(ab);endmodule应该注意的是,关系运算的结果是一个1bit信号3.2.3逻辑运算符:&&、||、!8/13/202011MicroelectronicsSchoolXidianUniversityab!a!ba&&ba||b110011100101011001001100表3.2-3逻辑运算符的真值表逻辑运算的结果是一个1bit信号例如:寄存器变量a、b的初值分别为4’b1110和4’b0000,则!a=1’b0,!b=1’b1,a&&b=1’b0;a||b=1’b1。3.2.4按位运算符:~、&、|、^、^~8/13/202012MicroelectronicsSchoolXidianUniversitymodulelength_mismatch(a,b,c);input[7:0]a;input[9:0]b;output[9:0]c;assignc=a&b;endmodule3.2.5归约运算符:&、|、^、~&、~|、~^、^~8/13/202013MicroelectronicsSchoolXidianUniversity归约运算符的操作数只有一个modulecut(a,m,n);input[7:0]a;outputm,n;assignm=&a;//判断输入信号中是否有0,若有0,m=1’b0assignn=|a;//判断输入信号中是否有1,若有1,n=1’b1endmodule3.2.6移位运算符:、8/13/202014MicroelectronicsSchoolXidianUniversitymoduleGeneralShifterOperation(a,b,c);input[2:0]a;input[1:0]b;output[4:0]c;regc;always@(aorb)c=ab;endmodulea[2:0]b[1:0]c[4:0]lshc[4:0]3.2.7条件运算符8/13/202015MicroelectronicsSchoolXidianUniversity条件表达式?表达式1:表达式2modulemux2(in1,in2,sel,out);input[3:0]in1,in2;inputsel;output[3:0]out;wire[3:0]out;assignout=(!sel)?in1:in2;//sel为0时out等于in1,反之为in2endmoduleselin1in2out018/13/2020moduletri_bus_interface(write_en,data_out,data_in,bus_data);parameterwidth=8;inputwrite_en;wirewrite_en;input[1:0]data_out;output[1:0]data_in;inout[1:0]bus_data;assignbus_data=write_en?data_out:2'bz;//“z”为高阻,即断开assigndata_in=bus_data;endmoduleENBENBwrite_en1data_out1data_in1write_en2data_out2data_in2bus_data读/写复用的总线双向总线收发器双向总线收发器总线设备1总线设备23.2.8连接和复制运算符:{}、{{}}8/13/2020{信号1的某几位,信号2的某几位,…,信号n的某几位}moduleshift_register8(din,clk,rst_n,dout);inputdin;inputclk;inputrst_n;outputdout;wiredin;wireclk;wirerst_n;wiredout;reg[7:0]shift_register;always@(posedgeclkornegedgerst_n)beginif(rst_n==0)shift_register=0;elseshift_register={shift_register[6:0],din};endassigndout=shift_register[7];endmodule3.3VerilogHDL数据流建模例程8/13/202018MicroelectronicsSchoolXidianUniversity例3.3-1:数据流建模方式1位数值比较器modulecompare_1(out,a,b);inputa,b;outputout;assignout=(ab)?;1’b1:1’b0;endmodule例3.3-2:通过归约运算符^实现奇偶校验器。moduleecc_8(even_bit,odd_bit,data);input[7:0]data;outputeven_bit,odd_bit;assigneven_bit=^data;assignodd_bit=~even_bit;endmodule例3.3-3:带超前进位的四位全加器。8/13/202019Mi
本文标题:硬件描算语言chapter3
链接地址:https://www.777doc.com/doc-6769928 .html