关于verilog几条语法

来源:互联网 发布:录像配音软件 编辑:程序博客网 时间:2024/06/06 03:26

1.关于wire和reg类型的使用:

  • input的变量一定只能是wire。output的变量可以是wire也可以是reg。inoutput的变量只能是wire型,因为类型中含有input成分。
  • 所有变量不加说明默认定义为wire型。
  • 在assign语句中使用wire类型。在always语句块中使用reg类型。

2.位拼接符 { }

  • 位拼接符使用:把某些倍号的某些位详细地列出来,中间用逗号分开,最后用大括号括起来表示一个整体信号。拼接时高位在前。
eg: input [3:0] numberH;    input [3:0] numberL;    output wire [7:0] number;    assign number = {numberH,numberL};

3.case endcase语句与if else语句

  • if语句语法基本与c语言相同,也具有优先级。
eg: if(flag == 0)      begin single = 3;end    else if(flag == 1)      begin single = 2;end    else if(flag == 2)      begin single = 1;end    else      begin single = 0;end```
  • case语句,不具有优先级
eg: case(flag)    2'b0: single = 3;    2'b1: single = 2;    2'b2: single = 1;    default: single = 0;    endcase
  • if语句与case语句:
    if占用资源相对较少,但执行时间较长。case语句与之相反。

4.always语句块与assign语句

always语句块一般用在时序逻辑电路中,在组合逻辑中也有应用。
/*敏感信号是需要检测的信号,当这些信号发生变化时,always语句块就会更新一次。对于时序逻辑而言,还需要有posedge,negedge,posedge or negedge修饰。*/语法: always@(敏感信号)     begin       语句体;     end 
  • always组合逻辑
  • 在组合逻辑电路中,用阻塞赋值 =
eg:  always@(a,b,c,d,x)     begin       case(x)       2'b0: y = a;       2'b1: y = b;       2'b2: y = c;       default: y = d;       endcase     end 
  • always时序逻辑
    在时序逻辑电路中,用非阻塞赋值 <=
eg:  always@(posedge clk or negedge res)     begin       if(clk)         y <= a;       else if(res == 0)         y <= 0;       else y <= y;     end 

5.assign 目标变量 = 驱动表达式

 eg: assign y = a & b;

6.多目运算符 ? :

eg: Y = (a&b)?c:d;/*与c语言神似的运算符。若a&b为真,Y=c,否者 Y=d。*/