Verilog基本语法和vivado

目录

  • Vivad 下载安装使用教程
  • VerilogHDL
    • 什么是VerilogHDL
    • verilog模块的定义
    • 编写verilog代码
      • 词法(可用单词)
      • 语法(单词如何组织成有意义的语句)
        • 基本结构
        • 各个语句(注意末尾加 ; )

Vivad 下载安装使用教程

这个网络上有很多申请license的方法和安装教程
如果嫌麻烦可以给我留言,给你发2018版的压缩包

VerilogHDL

什么是VerilogHDL

是一种用于数字逻辑电路设计的硬件描述语言
使用verilogHDL可以像设计软件一样设计硬件系统。(HDL:hardware description language 硬件描述语言)

verilog模块的定义

编写verilog代码

词法(可用单词)

  • 常用关键字:and always assign case else end if initial inout input integer for module or output parameter posedge

  • 标识符(类似c语言)

  • 注释(类似c++)://单行注释
    /*多

    注释
    */

  • 数字的写法:

    • 书写格式: <位数>’ <进制>数字
    • 进制:
      字母 意义
      b 二进制
      o 八进制
      d 十进制
      h 十六进制
    • 负数:在位数前加 “-”
    • 举例:3‘b101 3位 二进制 数值:5 储存:101
    • 特殊数字x z:x表示不定值,z表示高阻值
  • 常量、变量

    • 常量
      • 定义:在代码运行过程中,值不能改变的量,成为常量。
      • 数字(包括整数,x和z值,负数) 、 parame常量(或称为符号常量)
        定义格式: parameter 变量名1 = 数字,变量名2 =数字, … ;
        例子:parameter UP = 2’d0 ;
    • 变量
      • wire型变量
        格式:wire 变量名1,变量名2,…,变量名n ;
        wire[n-1:0] 变量名1,变量名2,… , 变量名m;(n是指位宽,数据宽度,共声明了m个变量,每个变量位宽为n)
      • reg型变量(具有记忆功能,always块里给变量赋值,变量必须是reg型)
        定义:在过程块中被赋值的信号,往往代表触发器,也可能是组合逻辑信号
        格式: reg 数据名1 ,数据名2,… ,数据名n;
        reg[n-1:0] 数据名1,数据名2, … ,数据名m;
      • memory型变量——reg数组
        定义:由若干个相同宽度的reg型变量组成的数组。
        可描述RAM、ROM和reg堆
        格式:reg[n-1:0] 储存器名[m-1:0];
        例子:
        reg[7:0] RAM[63:0]; //声明储存器RAM
        RAM[10]= 8’d34; //访问第10个储存单元
      • 其他变量:large型…
  • 运算符(八种)

    • 算术运算符(+ - * / %)
    • 逻辑运算符(&& || !)
    • 位运算符(& | ~ ^ ^~ )
    • 关系运算符( < > >= <=)
    • 赋值运算符(<= =)
    • 移位运算符(<< >>)
    • 条件运算符(?:)
    • 位拼接运算符({})
      reg[0:7] a_8, b_8;
      reg[0:15] a_1,b_16;
      always…begin
      a_16 = { a_8,b_8};
      end
    • 优先级
      Verilog基本语法和vivado_第1张图片
  • 表达式

语法(单词如何组织成有意义的语句)

基本结构

// verilog模块的基本结构
module <模块名>(口1,口2,...);
   
   ....
   <内部信号说明> (变量声明)
   ....
   
   <实例元件语句>
   <结构说明语句块>
endmodule 

begin
<语句>
end

相当于C语言中的大括号

各个语句(注意末尾加 ; )

  • assign语句:无论右边表达式操作数何时发生变化,右边表达式都会重新计算,并且给左边变量赋值。
    • 格式:assign <变量> = <表达式> ;
    • 一般用于赋值wire型变量
    • 因为一直执行,也被称为连续赋值语句
  • 实例元件或子模块语句
    • 格式: 模块名 实例名(口1,口2,……)
    • 用法:如已完成一个2选1数据选择器,即可在此器件中使用该语句,使用2选1 构成4选1
    module mux4(d0,d1,d2,d3,s,y);
       // I/O端口说明
       input [3:0] d0,d1,d2,d3;
       input [1:0] s;
       output [3:0] y;
       
       //内部信号说明(变量声明
       wire [3:0] low,high;
    
      //实例元件语句
      mux2 lowmux(d0,d1,s[0],low);
      mux2 highmux(d2,d3,s[0],high);
      mux2 finalmux(low,high,s[1],y);
    endmodule
    
  • 结构说明语句
    • always块(有触发条件)
      always @ (敏感信号列表)
      <语句>
      - 例子:

      (电平触发)
      always @ (a or b)  //每当a或b的值变化时执行一遍块内语句
      begin
          <语句>
      end
      (信号沿触发,只能一位)
      always @ (posedge clk) //每当时钟上升沿到来时执行一遍
      
    • initial 块 (没触发条件,只在仿真零时刻执行一次)
      initial
      <语句>

      • 一般用于测试激励文件
  • 赋值语句(能在alway和initial块中使用)
    • 不建议将一个reg变量分开赋值
    • 与assign的区别:
      • assign是连续赋值,等号左右恒等,只能写在always外,左边是wire变量,与always块并发执行。
      • 赋值语句是在块内赋值,触发时,将等号右边的值赋给左边。写在alway块或者initial块中,左边是reg变量。
    • 阻塞赋值:= 描述组合逻辑电路
    • 非阻塞赋值 <= 描述时序电路
    • 例子:一位全加器
module add1(a,b,cin,sum,cout)
  input a,b,cin;
  output sum,cout;
 
  wire q = a & b ; //内部变量
  wire g = a ^ b ;

  assign sum = cin ^ g ;  //连续赋值
  assign cout = cin & g | q ;
endmodule
  • 条件语句(只能在always块中使用)
  • 多分支选择语句(只能在always块中使用)
    • case(表达式)
      <分支一>:<语句>
      <分支二>:<语句>
      default:<语句>
      endcase
  • 块语句:begin <语句> end

你可能感兴趣的:(数电)