一,Verilog HDL语言数据类型 1.常量 (1)数字常量 Verilog HDL 语言中的数值集合由以下 4 个基本的值组成: 1——代表逻辑 1 或真状态; 0——代表逻辑 0 或假状态; X(或 x)——代表逻辑不定态; Z(或 z)——代表高阻态 2.变量 Verilog HDL 语言中的变量可分为两种:一种为线型,另一种为寄存器型 wire,tri 连线类型 wor,trior 具有线或特性的连线 wand,triand 具有线与特性的连线 tri1,tri0 分别为上拉电阻和下拉电阻 supply1,supply0 分别为电源(逻辑 1)和地(逻辑0) 寄存器型变量需要被明确地赋值,并且在被重新赋值前一 直保持原值,必须将寄存器型变量放在过程块语句中,通过过程赋值语句赋值。 reg 型变量是 最常用的一种寄存器型变量,它的定义格式与 wire 型类似,具体格式为: reg 数据名 1,数据名 2,……,数据名 n; reg[n-1:0] 数据名 1,数据名 2,……,数据名 n; 例如: reg a,b; //定义了两个 reg 型变量 a,b;这两个变量的宽度均是 1 位 reg [7:0] ledout; //定义了 1 个 8 位 reg 型变量 ledout 二,结合程序分析 module temp(ledout); // output ledout;//端口,默认是线性 output[7:0] ledout;// wire[7:0] ledout//线性型 //reg[7:0] ledout//寄存器型变量 //assign ledout=8’hff;//连续赋值语句不能出现在过程块中 reg[15:0] l,m,n,p;//过程赋值语句只出现在过程块中 initial//相当于初始化只能执行一次 begin p=0; end assign ledout=8’hff; always//相当于while(1) begin // ledout=8’hff;//寄存器型变量 end //always@( k1)//执行always语句根据k1值的变化,而执行,k1值变化,此语句执行,不变化不执行。 //always@(posedge k1)//k1松开时执行语句(有上升沿,则执行) //always@(negedge k1)//k1按下时执行语句(有下降沿,则执行) always begin//过程块中语句顺序是从上到下 m=8’h0f;//阻塞型过程赋值语句有先后顺序,从上到下。 n=8’h00; // l<=8’hf0;//非阻塞型过程赋 值语句无先后顺序,同时执行 // m<=8’h0f; // n<=8’h00 //这三个同时执行 if(m>8)//这个语句与上面的非阻塞型过程赋 值语句是有先后的 m=n; case(m)//case语句相当于switch 1: ; 2: ; default: ;//如果上面选项值没有与表达式的值相等时,就执行此缺省语句。 endcase end always begin //for(l=0;l<200;l=l+1) l=0;//先定义 while(l<200) begin//多条语句时使用begin—end p=p+1; l=l+1; end end endmodule #在module中可以多次使用always,他们是并行执行,没有先后顺序 #过程赋值语句要用寄存器型变量赋值,连续赋值语句要用线型变量赋值 #连续赋值语句以关键词 assign 为先导;而过程赋值语句不需要任何 先导的关键词 #过程赋值语句有两种赋值形式:阻塞型过程赋值和非阻塞型过程赋 值 #过程赋值语句不需要任何 先导的关键词,但是,语句的赋值分为阻塞型和非阻塞型 四,条件语句和循环语句 1.Verilog HDL 语言中的条件语句有两种,即 if-else 语句和 case 语句 2.条件语句必须在过程块中使用,必须是always或initial的子句。 3.if条件句 格式1: if(表达式) begin 语句1; 语句2; end else//条件为0,x,z时,执行以下语句 语句3; 格式二: if(表达式) 语句1; else if(表达式) 语句2; ……. else if (表达式N) …… else 语句N+1; 4.循环语句: 下面举例用 while 语句对 8 位二进制数中值为 1 的位进行计数 reg[7:0] temp;//定义了位宽为8的寄存器temp integer count = 0;//定义整数类型count作为计数器 temp = rega;//temp被赋值了8位二进制数的值 while(temp)//判断temp是否为0,当为1时执行下面循环体 begin if(temp[0]) count = count + 1;// 如果temp最低位 为1,执行count+1 temp = temp >> 1; //最低位移除,最高位补零,其余右移。然后再次判断temp是否非零,若非零,接着判断temp的最低位是否为1,就是上次循环的次低位。 end 5.for语句: 下面举例用 for 语句对 8 位二进制 数中值为 1 的位进行计数。 reg[7:0] temp; integer count = 0; for(temp = rega;temp!=0;temp = temp >>1) if(temp[0]) count = count + 1; 三、编写程序 1.统计实验板上K1~K8中有多少个按键被按下?并把结果显示在8个小灯上(说明:如果有3个键被同时按下,则亮3盏灯,如果有4个键同时按下,则亮4盏灯,……)。 module test(key,ledout); input[7:0] key; output[7:0] ledout; reg[7:0] temp; reg[7:0] ledout; integer count; integer i; always@(key) begin temp=key;////temp=~key count=0; for(i=0;i<8;i=i+1) begin if(temp[0]==0) count=count+1; temp=temp>>1; end end always begin ledout=8’b11111111; ledout=ledout<


一个好奇的人