Verilog基本语法和vivado

    技术2022-07-11  92

    目录

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

    Vivado 下载安装使用教程

    这个网络上有很多申请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模块的基本结构 module <模块名>(口1,口2,...); <I/O端口说明> .... <内部信号说明> (变量声明) .... <assign语句> <实例元件语句> <结构说明语句块> 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
    Processed: 0.012, SQL: 9