- 473.00 KB
- 2022-08-11 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
EDA课程设计-VerilogHDL程序设计教师:郑兆兆2013年12月30日\n原理图设计输入硬件描述语言设计输入(VHDL、VerilogHDL)波形设计输入底层设计输入层次设计输入EDA设计输入方式\nVerilogHDL是目前应用最为广泛的硬件描述语言之一,与VHDL各有千秋。1993年,IEEE专门成立IEEE1364工作组制定VerilogHDL的标准,在1995年发布了第1个VerilogHDL的标准,即IEEE1364-1995。随后,IEEE在2002年发布了经过修订的VerilogHDL新标准,命名为IEEE1364-2001。VerilogHDL允许在不同的抽象级别上对数字电路系统进行描述,这些抽象级别包括系统级(SystemLevel)、算法级(AlgorithmLevel)、寄存器传输级(RegisterTransferLevel)、门级(GateLevel)和开关级(SwitchLevel)。系统级、算法级、寄存器传输级描述都被称为行为描述。\nVerilogHDL语言特点:(1)VerilogHDL语法规则与C语言十分相像。(2)VerilogHDL语法检查不严格。(3)VerilogHDL自身带有仿真指令。\nVerilogHDL基础VerilogHDL设计模块结构一个完整的VerilogHDL设计模块包括端口定义、I/O声明、变量类型声明和功能描述等4个部分。moduledecide(f,a,b,c);//端口定义inputa,b,c;/*I/Ooutputf;声明*/wirea,b,c;/*变量regf;类型声明*/always@(aorborc)/*功begin能…….描end述*/endmodule\n(1)模块端口定义模块端口定义用来声明电路设计模块的输入输出端口,端口定义格式如下:module模块名(端口1,端口2,端口3,…);例:moduledecide(f,a,b,c);(2)模块的I/O声明模块的I/O声明用来声明模块端口定义中各端口数据流动方向,包括:input(输入),output(输出)和inout(双向)。I/O声明格式如下:input端口1,端口2,端口3,…;//声明输入端口output端口1,端口2,端口3,…;//声明输出端口例:inputa,b,c;outputf;\n(3)变量类型声明变量类型声明用来表明设计电路的端口和内部电路使用的变量的数据类型。变量的数据类型主要有wire(连线),reg(寄存器),integer(整型),real(实型)和time(时间)输入/输出端口类型默认时,自动定义为wire型。\n(4)功能描述功能描述是VerilogHDL程序设计中最主要的部分,用来描述设计模块的内部结构和模块端口间的逻辑关系,在电路上相当于器件的内部电路结构。功能描述可以用assign语句、元件例化(InstAntiate)、always块语句、initial块语句等方法来实现,通常把确定这些设计模块描述的方法称为建模。\nVerilogHDL的词法(一)空白符和注释(二)常数<位宽>’<进制符号><数字>(三)字符串(四)标识符区分大小写(字母、数字、下划线)(五)关键词(六)操作符(1)算术操作符求余符号%(2)逻辑操作符(3)位运算(4)关系操作符等(七)VerilogHDL数据对象\nVerilogHDL的语句(一)赋值语句(1)门基元赋值语句基本逻辑门关键词例化门标识符(门输出,门输入1,门输入2,…,门输入n);例如:具有a,b,c,d输入和y输出与非门的门基元赋值语句为:nandu1(y,a,b,c,d);\n(2)连续赋值语句连续赋值语句的关键词是assign,赋值符号是“=”,连续赋值语句“=”号两边的变量都应该是wire型变量。连续赋值语句的格式为assign赋值变量=表达式;例如,具有a,b,c,d输入和y输出与非门的连续赋值语句为assigny=~(a&b&c&d);\n(3)过程赋值语句过程赋值语句出现在initial和always块语句中,包括阻塞赋值语句、非阻塞赋值语句。在过程赋值语句中,赋值变量必须是寄存器型变量(reg、integer、real)。i)阻塞赋值语句阻塞赋值符号是“=”,语句格式为 赋值变量=表达式;例:y=~(a&b&c&d);其值在该语句结束即可得到。ii)非阻塞赋值语句非阻塞赋值符号是“<=”,语句格式为:赋值变量<=表达式;例:y<=~(a&b&c&d);其值不像在阻塞赋值语句那样,语句结束时即刻得到,而在该块语句结束才可得到。\nalways@(posedgeclock)beginm=3;n=75;n<=m;r=n;//r=75;end\n阻塞赋值、非阻塞赋值用法8要点:(1)时序电路建模时,用非阻塞赋值<=。(2)锁存器电路建模时,用非阻塞赋值<=。(3)用always块建立组合逻辑模型时,用阻塞赋值=。(4)在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。(5)在同一个always块不要既用非阻塞赋值又用阻塞赋值。(6)不要在一个以上always块中为同一个变量赋值。(7)用$strobe系统任务来显示用非阻塞赋值的变量值。(8)在赋值时不要使用#0延迟。\n(二)条件语句条件语句包含if语句和case语句,它们都是顺序语句,应放在always或initial块中。(1)if语句if语句有3种格式i)if(表达式)begin语句;endii)if(表达式)begin语句;endelsebegin语句;endiii)if(表达式)begin语句;endelseif(表达式)……..\n(2)case语句case(表达式)选择值1:语句1;选择值2:语句2;…选择值n:语句n;default:语句n+1;endcase/case语句变体casex、casez\n(三)循环语句循环语句包含for语句,repeat语句,while语句和forever语句4种。建议使用for语句。\n(四)结构声明语句结构声明语句包括always,initial,task和function等4种结构。(1)always块语法结构always@(敏感信号表达式)//列出影响块内取值的所有信号,各信号之间用“or”连接。对于组合电路而言,所有输入信号都是敏感信号;对于时序电路而言,一般取时钟信号和复位信号为敏感信号。begin//过程赋值语句;//if语句,case语句;//tast语句、function语句;end\n敏感信号使用注意事项:(1)敏感信号列表中的任何信号发生变化时,都将启动always块语句,使always块内语句按顺序执行一次。(2)敏感信号可以为电平敏感信号,也可以是边沿敏感信号。(3)关键词“posedge”表示上升沿,关键词“negedge”表示下降沿。(4)在一个敏感信号列表中,不要既有电平信号又有边沿信号。\n(五)语句的顺序执行与并行执行VerilogHDL中由顺序执行语句和并行执行语句之分。VerilogHDL的always块中的语句是顺序语句,按照程序书写的顺序执行。但always块本身却是并行语句,always块语句中敏感信号表中列出的任何信号的改变,都将启动always块语句,使always块语句内相应的顺序语句被执行一次。always块、initial块、和assign都是并行的。\nVerilogHDL模块设计(一)门电路设计(1)assign语句建模用assign描述一个2输入端与非门的语句格式为assigny1=~(a1&&b1);y1为wire型变量\n(2)用门级元件例化建模方式(门基元赋值语句)门类型关键词〈例化门的名称〉(端口列表);门类型关键词包括:not(非门)、and(与门)、nand(与非门)、or(或门)、nor(或非门)、xor(异或门)、xnor(异或非门)、buf(缓冲器)及bufif1、bufif0、notif1和notif0等各种三态门。用门级元件例化建模方式来描述2输入端与非门的语句格式为nandu1(y1,a1,b1);//u1是可选的例化门名称\n(二)组合逻辑电路设计在组合逻辑电路中,任何时刻的输出仅决定于当时的输入信号在数字系统中,有些逻辑电路是经常使用的,如加法器、编码器、译码器、数据选择器、数据比较器、奇偶校验器等。\n用VerilogHDL的case语句可以直接描述真值表3-3(35页)表示的逻辑抽象结果,完整的源程序bcd8421.v如下:modulebcd8421(A,B);input[3:0]A;output[3:0]B;reg[3:0]B;always@(A)begincase(A)0:B=3;1:B=4;2:B=5;3:B=6;4:B=7;5:B=8;6:B=9;7:B=10;8:B=11;9:B=12;default:B=4’bx;endcaseendendmodule\n下面是用VerilogHDL的if语句编写的8421BCD码到余3BCD码转换电路bcd8421_1.v:modulebcd842_1(A,B);input[3:0]A;output[3:0]B;reg[3:0]B;always@(A)beginif(A<=9)B=A+3;elseB=4’bx;endendmodule在源程序中,仅用“B=A+3;”就可以得到余3BCD码的结果。\n(三)基于VerilogHDL的触发器设计图3-2基本RS触发器电路结构根据基本RS触发器的输出表达式用VerilogHDL的结构描述方式编写的源程序RS_FF.v如下:moduleRS_FF(Q,QN,SDN,RDN);inputSDN,RDN;outputQ,QN;assignQ=~(SDN&&QN);assignQN=~(RDN&&Q);endmodule\n根据基本RS的特性(见表3-4,37页),也可以用VerilogHDL行为描述方式设计基本RS触发器,源程序RS_FF_1.v如下:moduleRS_FF(Q,QN,SDN,RDN);inputSDN,RDN;outputQ,QN;regQ,QN;always@(RNorSN)begincase({RN,SN})'b00:beginQ='bx;QN='bx;end'b01:beginQ=0;QN=1;end'b10:beginQ=1;QN=0;end'b11:beginQ=Q;QN=QN;endendcaseendendmodule\n(四)时序逻辑电路设计电路结构决定了时序逻辑的特点,即任一时刻的输出信号不仅取决于当时的输入信号,而且还取决于电路的原来的状态。\n根据十进制同步计数器(异步清除)的功能,用VerilogHDL设计的源程序CT74160.v如下:moduleCT74160(LDN,D3,D2,D1,D0,CP,CRN,EP,ET,Q3,Q2,Q1,Q0,OC);inputLDN,D3,D2,D1,D0,CP,CRN,EP,ET;outputQ3,Q2,Q1,Q0,OC;regQ3,Q2,Q1,Q0,OC;reg[3:0]Q_TEMP;always@(posedgeCPornegedgeCRN)beginif(~CRN)Q_TEMP=4’b0000;elseif(~LDN)Q_TEMP={D3,D2,D1,D0};elseif(EP&&ET)if(Q_TEMP<4’b1001)Q_TEMP=Q_TEMP+1;elseQ_TEMP=4’b0000;elseQ_TEMP=Q_TEMP;endalwaysbeginif(Q_TEMP==4’b1001&&ET==1’b1)OC=1’b1;elseOC=1’b0;{Q3,Q2,Q1,Q0}=Q_TEMP;endendmodule\n用结构描述实现电路系统设计任何用VerilogHDL描述的电路设计模块(module),均可用模块例化语句,例化一个元件,来实现电路系统的设计。模块例化语句格式与逻辑门例化语句格式相同,具体格式如下:元件名〈例化元件的名称〉(端口列表);\n(一)位置关联法位置关联法要求端口列表中的引脚名称应与设计模块的输入/输出端口一一对应,多个端口名之间用“,”(半角逗号)分隔。例如,在4位二进制计数器cnt4e的设计中,Q、COUT、CLK和ENA分别是4位二进制计数器的状态输出端和使能控制输入端(注意这是电路设计时用“modulecnt4e(Q,COUT,CLK,ENA);”语句定义的端口名称和顺序),则语句“cnt4eu1(X1,X2,CLK,ENA);”表示cnt4e元件的Q、COUT、ClK和ENA引脚分别与插座上的X1、X2、CLK和ENA引脚连接。\n(二)名称关联法名称关联法的端口列表格式如下:(.设计模块端口名(插座引脚名),.设计模块端口名(插座引脚名,…);\ncnt4e是用VerilogHDL设计的4位二进制计数器的元件符号,源程序如下。modulecnt4e(Q,COUT,CLK,ENA);inputCLK,ENA;output[3:0]Q;outputCOUT;reg[3:0]Q;regCOUT;always@(posedgeCLK)beginif(ENA)Q=Q+1;if(Q==’b1111)COUT=’b1;elseCOUT=’b0;endendmodule\ndec7s是用VerilogHDL设计的七段显示译码器的元件符号,源程序如下。moduledec7s(A,Q);input[3:0]A;output[6:0]Q;reg[6:0]Q;always@(A)begincase(A)0:Q=’b0111111;1:Q=’b0000110;2:Q=’b1011011;3:Q=’b1001111;4:Q=’b1100110;5:Q=’b1101101;6:Q=’b1111101;7:Q=’b0000111;8:Q=’b1111111;9:Q=’b1101111;10:Q=’b1110111;11:Q=’b1111100;12:Q=’b0111001;13:Q=’b1011110;14:Q=’b1111001;15:Q=’b1110001;endcaseendendmodule\n根据图3-4所示的原理图结构,用VerilogHDL位置关联法描述的计数译码电路的顶层源程序文件cnt_dec7s.v如下:modulecnt_dec7s(Q,COUT,CLK,ENA);inputCLK,ENA;output[6:0]Q;outputCOUT;wire[3:0]X1;cnt4eu1(X1,COUT,CLK,ENA);//modulecnt4e(Q,COUT,CLK,ENA);dec7su2(X1,Q[6:0]);//moduledec7s(A,Q);endmoduleX1\ncnt4eu1(.Q(X1),.COUT(COUT),.CLK(CLK),.ENA(ENA));dec7su2(.A(X1),.Q(Q[6:0]));X1