您好,欢迎访问三七文档
erlioghdl语法要点一、常用的数据类型1.四种常用的数据类型reg,wire,integer,parameter2.常量(1)数字A.整数1)B或b--二进制整数2)D或d--十进制3)H或h--十六进制4)O或o--八进制例子:11'b00000000000注意:*位宽可省略,位宽由机器指定*进制也可省略,数字---默认是十进制parameterREADFLAG=11'b00100000000;//parameterWRITERAM=11'b01000000000;//写RAMparameterREADRAM=11'b10000000000;//读RAMparametercur_inc=1;parametercur_dec=0;parametercur_shift=1;SETMODE:beginlcd_rs=0;lcd_rw=0;data[7:2]=6'b000001;data[1]=cur_inc;data[0]=cur_noshift;B.x和z值,x--不定值,z-高阻值data=8'bzzzz_zzzz;C.负值的写法-8'd5(正确)8'd-5(错误)D.下划线8'b0100_11008'b01001100上面的两个值一样,加下划线为增加可读性8'b_0100_1100(错误)(2)参数parameter参数名1=表达式1,参数名2=表达式3;4.变量reg[3:0]dataout_buf[3:0];reg[3:0]dataout_code;integeri;wire[7:0]cal;assigncal[0]=(dataout_buf[0]==9)?1:0;//个位向十位进位标志assigncal[1]=(cal[0]&&dataout_buf[1]==9)?1:0;//十位向百位进位标志assigncal[2]=(cal[1]&&dataout_buf[2]==9)?1:0;//百位向千位进位标志assigncal[3]=(cal[2]&&dataout_buf[3]==9)?1:0;//千位向万位进位标志(1)存储器型变量reg[3:0]dataout_buf[5:0];//dataout_buf--存储器名,[5:0]--存储器的个数,[3:0]--每个存储器的位宽注意存储器可单个使用。(2)网络型变量:常用的有两种:wire,tri(三态)(3)寄存器变量寄存器是数据存储单元的抽象。寄存器变量,通过赋值语句可以改变寄存器存储的值。二、常用的运算符1.重点:(1)三目运算r=s?t:u;//可形成一个条件语句(2)取反3'b001:begin//发“来”cnt=cnt+1;if(cnt==22'h3fffff)state=3'b010;if(clk_div2!=lai)clk_div2=clk_div2+1;elsebeginclk_div2=0;out=~out;end(3)位拼接运算符--{}1)可以把两个或多个信号的某些位拼接起来进行运算操作。2)格式:{信号1的某几位,信号2的某几位,...,信号n某几位}dial[7:0]={led[7],led[6],....,led[0]};dial[7]=led[7];dial[6]=led[6];..........dial[0]=led[0];dial[7:0]={led[7:4],....,led[0]};3)具有重要参考价值的拼接方式:{a,b[3:0],w,3'b101};//不同位宽的变量和整数值一起可以拼接成一个新的变量{a,b[3],b[2],b[1],b[0],w,1'b1,1'b0,1'b1};注意:A.dial[7:0]=led[7:0]//注意的做不到每个控制每个led灯B.{4{w}}={w,w,w,w}C.{b,{3(a,b)}}={b,a,b,a,b,a,b}(4)缩减运算符---是单目运算,与、或、非运算1)先将操作数的第一位与第二位进行与或非运行2)将运算结果与第三位进行与、或、非运算,直至最后一位。使用方法:reg[3:0]B;regC;C=&B;相当于:C=((B[0]&B[1])&B[2])&B[3];三、块语句1.常用的是两种语句块:begin...end--顺序块fork....join---并行块2.顺序块(1)语句按顺序执行(2)每条语句的延迟时间是相对与前一条语句的仿真时间而言。(3)顺序块里加延时例子:begin:块名areg=breg;#10creg=areg;areg=dreg;end注意:在顺序执行的begin...end,非阻塞赋值,可以把顺序执行改变成近于并发执行。3.并行块(1)块内的语句同时执行(2)块内每条语句的延迟时间是相对于程序控制进入到块内的仿真时间。fork#50r='h35;#100r='hE2;join注意:通过上面的方式,变成顺序执行。四、条件语句(一)if语句的形式(1)无分支--ifif(ab)out1=int1;(2)单级分支--if...elseif(ab)out1=int2;elseout1=int1;(3)多级分支if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;else语句n;(二)注意:1.当表示条件的表达式的值为1时,按真处理;表达式的值为0,x,z按假处理if(a)out1=int2;2.if语句的嵌套if(expression)beginif(expression2)语句1(内嵌if)else语句2endelseif(expression3)语句3(内嵌if)else语句4注意:if和离它最近的else配对,为防止混乱和增加可读性,可以用begin_end来区隔。若begin_end使用不当可改变逻辑关系:例子:if(index0)for(scani=0;scaniindex;scani=scani+1)if(memory[scani]0)begin$display(...);memory[scani]=0;endelse$display(error);五、Case语句(一)状态机1.parameterstate0=3'b000,state1=3'b001,//mealy状态机,其参数的位数非常灵活state2=3'b010,state3=3'b011,state4=3'b100,state5=3'b101,state6=3'b110,state7=3'b111;注意:状态机需要声明上面的连续的数值2.和case语句配合使用always@(state)begincase(state)state0:c=8'b0000_0011;state1:c=8'b1001_1111;state2:c=8'b0010_0101;state3:c=8'b0000_1101;state4:c=8'b1001_1001;state5:c=8'b0100_1001;state6:c=8'b0100_0001;state7:c=8'b0001_1111;endcaseend3.也可以选择的执行CLEAR:beginlcd_rs=0;lcd_rw=0;data=8'b0000_0001;state=SETMODE;endSETMODE:beginlcd_rs=0;lcd_rw=0;data[7:2]=6'b000001;data[1]=cur_inc;data[0]=cur_noshift;state=SETDDRAM1;endRETURNCURSOR:beginlcd_rs=0;lcd_rw=0;data=8'b00000010;state=WRITERAM;endSWITCHMODE:beginlcd_rs=0;lcd_rw=0;data[7:3]=5'b00001;data[2]=open_display;data[1]=open_cur;data[0]=blank_cur;state=CLEAR;endSHIFT:beginlcd_rs=0;lcd_rw=0;data[7:4]=4'b0001;data[3]=shift_display;data[2]=left_shift;data[1:0]=2'b00;state=IDLE;endSETFUNCTION:beginlcd_rs=0;lcd_rw=0;data[7:5]=3'b001;data[4]=datawidth8;data[3]=twoline;data[2]=font5x10;data[1:0]=2'b00;state=SWITCHMODE;endSETCGRAM:beginlcd_rs=0;lcd_rw=0;data=8'b01000000;state=IDLE;endSETDDRAM1:beginlcd_rs=0;lcd_rw=0;state=WRITERAM;if(counter==0)data=8'b1000_0000;elsedata=8'b1100_0000;endSETDDRAM2:beginlcd_rs=0;lcd_rw=0;data=8'b10000000;state=WRITERAM;end//0x80显示在第一行4.简化程序,调用语句块更加简洁always@(count)begincase(count)0:state=4'b1111;//低音“3”1:state=4'b1111;//持续4个时钟节拍2:state=4'b1111;3:state=4'b1111;4:state=4'b0000;//低音“5”5:state=4'b0000;//发3个时钟节拍6:state=4'b0000;7:state=4'b0001;//低音“6”8:state=4'b0011;//中音“1”9:state=4'b0011;//发3个时钟节拍10:state=4'b0011;end(二)一般有3种形式(1)case(表达式)case分支项default表达式endcase(2)casez(表达式)case分支项endcase(3)casex(表达式)case分支项endcase注意:1..每个分支表达式的值必须互不相同,否则出错2..在用case语句进行比较时,只有信号的值明确才能比较。3..case语句所有表达式的值的位宽必须相等,一个经常犯的错误是,用'bx,'bz来代替n'bx,n'bz4.当分支表达式中存在不定值x和高阻值z时,处理方法如下:5.两种特殊case语句的处理方法:例子一:六、循环语句(一)循环语句的类型(1)forever:连续的执行语句(2)repeat:连续执行一条语句n次(3)while:执行一条语句直到条件不满足(4)for:执行一条语句直到条件不满足(二)分别介绍:1.forever语句:格式:foreverbeginend2.repeat:格式:repeat(表达式)beginend3.while:格式:while(表达式)语句或while(表达式)begin多条语句;end4.for:for(表达式1--给循环的变量赋初值;表达式2--结束条件;表达式3--变量的增加方式)语句例子:for(scani=0;scaniindex;scani=scani+1)begin语句;end函数和任务一、函数:(一)格式function[位宽]函数名称函数参数声明--一般是声明输入........语句区endfunction例子:function[7:0]ddram;input[5:0]n;begincase(n)6'b000_000:ddram=8'b01001100;//L6'b000_001:ddram=8'b0110_1001;//i6'b000_010:ddram=8'b0110_0011;//c6'b000_011:ddram=8'b0110_1000
本文标题:FPGA语法
链接地址:https://www.777doc.com/doc-5310976 .html