FPGA verilog学习总结

一、语法

1、<=是时序逻辑,  =是组合逻辑。

2、变量分类

        1)网络型(nets)

                wire(取值为0、1、x(不定值),z(高阻))、tri、tri0、tri1

                使用:wire [7:0]   datebus;

        2)寄存器类型(register)

                 触发器、寄存器:reg 

                  各种变量、纯数学抽象描述:integer、real、time

3、进制

         8'b10100101:  8位的二进制数据10100101.

4、运算符

         注意单目和双目,单目为单个变量的安位运算,双目为两个变量的运算。

         {}:连接符

5、语句

      1)赋值语句

      2)条件语句

             if-else、 case

      3)循环宇语句

              forever、repeat、while、for

      4)结构说明语句

              initial、always、task、function

      5)编译预处理语句

              define、include、timescale

6.过程块

       1)always @(<敏感信号表达式>)

             begin

             ******

             ******

             end

 

             always不能嵌套

         2)posedge与negedge

         3)initial过程块

                 模拟硬件上电之后的行为。不可综合,上电之后只执行一次,不能嵌套多个initial,有多个initial需并行执行。

         4)连续赋值语句assign

                   常用于对wire型变量赋值。例如:

                    input a,b

                    output c

                    assign c=a&b;

                    a,b信号灯的任何变化,都将随时反映到c信号上来。

7.块语句

    1)顺序块:begin  end

          在begin和end中间的语句按顺序执行,串行执行。

    2)并行块:fork  join(常用来仿真)

          在fork和join中间的语句同时执行,并行执行。

 

8.语法要点 

    1)always里面赋值左边必须申明为reg

    2)assign表达式左边必须申明成wire

    3)阻塞赋值用=

    4)非阻塞赋值用<=

 

    1)  边沿触发生成寄存器的时序逻辑(只有寄存器才能完成边沿触发这种逻辑)

    2)电平触发条件完整,生成组合逻辑

    3)电平触发,条件不完整,生成锁存器的时序逻辑

 

    结论:

    声明成reg,不一定得到寄存器

    未声明成reg,也可能得到锁存器

 

Coding要点

     1)如果是边沿触发逻辑

           比如always@(posedge clk),里面一律使用<=赋值

    2)如果是电平触发的逻辑,一律使用=赋值

           逻辑简单用assign语句;逻辑复杂,用always语句(分支条件写完整,防止出现锁存器)

   

二、函数

1.定义格式:

    function<返回值位宽或类型>  <函数名>

          输入端口与类型说明:

          局部变量说明;

          语句或语句块;

    endfunction

2.调用格式:

    <函数名>  (<输入表达式1>, <输入表达式2>,...)

函数定义:

function[7:0] getbyte;  //函数定义结构开头,此行中不能出现端口列表
    input[63:0] word;   //输入端口1
    input[3:0] bytenum; //输入端口2
    integer bit;        //局部变量说明
    reg[7:0] temp;      //局部变量说明
    begin
      for(bit=0;bit<=7;bit=bit+1)
      temp[bit]=word[((bytenum-1)*8)+bit];   //第一条行为语句
      getbyte=temp;                          //第二条行为语句
    end
endfunction              //函数定义结束

函数调用:

module demo_function_call;
  reg[7:0] call_output;
  reg[63:0] call_input1;
  reg[3:0] call_input2;
  initial
  begin
      call_input1=64'h123456789abcdef0;
      call_input2=3;
      call_input=getbyte(input1,input2);   //第一次调用
      #100;
      call_input=getbyte(input1,input2);   //第二次调用
  end
endmodule

 

3.task与function

    task:无返回值

    function:有返回值

 

    task <任务民>;

            <端口及数据类声名语句>

            <语句1>

            <语句2>

                ......

            <语句n>

    endtask

   任务的声名语句:

    <任务名>  (端口1,端口2,.....端口n);

 

例:

module top;
       reg clk, a, b;
       DUT  u1(out, a, b, clk);
       always #5 clk=!clk;
       task neg_clocks;
             input [31:0]  number_of_edges;
             repeat(number_of_edges)
                   @(negedge clk);
        endtask
        initial  begin
                   clk=0; a=1; b=1;
                   neg_clocks(3);  //任务调用
                   a=0;
                   neg_clocks(5);
                   b=0;
                   end
endmodule     

 

 

你可能感兴趣的:(FPGA verilog学习总结)