verilog 语法及特点

news/2024/9/23 14:27:39/

主线上的硬件描述语言有verilog 和 VHDL 两门, 由于 verilog 语法上比VHDL 语言灵活, 所以现在社区以 verilog 语言开发的项目占比更大。 但是相较于 现在流行的 java/python 计算机语言比起来, 其模块化管理要差很多, 所以现在社区有 类是 java 语言的 Chisel 设计。不过大部分FPGA厂家都只提供了 verilog/VHDL 两门语言的综合逻辑, 所以其他的语言都是最终要转换到 这两门语言上。 下面我们来看看流行的 verilog 语言的一些基本的知识。

Verilog HDL(Hardware Description Language)是在用途最广泛的 C 语言的基础上发展起来的一种硬件描述语言,具有灵活性高、易学易用等特点。Verilog HDL 可以在较短的时间内学习和掌握,目前已经在 FPGA 开发/IC 设计领域占据绝对的领导地位。

Verilog 的特点:

  1. 能形式化的抽象表示电路的行为和结构;
  2. 支持逻辑设计中层次与范围的描述;
  3. 可借用高级语言的精巧结构来简化电路行为和结构;
  4. 支持电路描述由高层到低层的综合转换;
  5. 硬件描述和实现工艺无关。

Verilog 的语法:

  1. verilog 命名和 c/c++ 基本相似, 但是命名里面多两个一个$字符

  2. 由于 verilog 的数字更多考虑的是逻辑门, 所以通常以 直观的 二进制表示, 而且位数是有效必须指定的, 格式 <位数>'b<二进制数> 如 8’b00000001. 有时候也用 10 进制,16 进制, 格式如 8’d1, 8’ha (8’b00001010), 8 表示的是转换为 2 进制的位数. 16 进制中的加入了 ABCDEF 子母.

  3. verilog 有 3 大数据类型: 寄存器类型(reg), 线网类型(wire)和参数类型(parameter). 下面是其定义方式:

    //reg 定义
    reg [31:0]  delay_cnt; //延时计数器
    reg         key_flag;  //按键标志
    //wire 定义
    wire       data_en; //数据使能信号
    wire [7:0] data;    //数据
    //parameter 定义
    parameter DATA_WIDTH = 8; //数据位宽为8位
    
  4. 算术运算 ±* / %, 关系运算 > < >= <= == !=, 逻辑运算 ! && ||, 条件运算符 ? :, 位运算符 & | ^ ~, 移位运算 << >>, 拼接运算 { }, 运算符优先级 与 python 基本一致(都是在 c 语言那里继承的).

  5. 模块定义

    // 模块定义 module 开头, endmodule 结尾
    module led(input sys_clk, // 系统时钟input sys_rst_n, // 系统复位, 低电平有效output reg [3:0] led // 4 位 led 灯
    )
    // 变量定义
    parameter WIDTH = 25;
    parameter COUNT_MAX = 25_000_000; // 板载50MHz时钟 = 20ns, 0.5/20ns = 25MHz, 需要25bit位宽 (25'b1011111010111100001000000)reg [WIDTH-1:0] counter; // reg 信号, 一般情况下代表寄存器
    reg [1:0] leg_ctrl_cnt;wire counter_en; // wire 信号, 就是硬件连线// 程序逻辑// 计数到最产生一个高电平信号
    assign counter_en = (counter == (COUNT_MAX-1'b1))? 1'b1 : 1'b0;// 用于产生0.5秒 使能信号计数器
    always @(posedge sys_clk or negedge sys_rst_n) begin // 代表 sys_clk 上升沿或者 sys_rst_n 下降沿触发// begin/end 中间是一个语句块if (sys_rst_n == 1'b0)counter <= 1'b0;else if (counter_en)counter <= 1'b0;elsecounter <= counter + 1'b1; // <= 代表信号是非阻塞赋值
    end// led 流水控制计数器
    always @(posedge sys_clk or negedge sys_rst_n) beginif (sys_rst_n == 1'b0)led_ctrl_cnt <= 2'b0;else if (counter_en)led_ctrl_cnt <= led_ctrl_cnt + 2'b1;
    end// 通过控制IO口的高低信号,控制LED的亮灭
    always @(posedge sys_clk or negedge sys_rst_n) beginif(sys_rst_n == 1'b0)leg <= 4'b0;else begin  // if else 语句, 如果包括多条语句, 需要用 begin/end 括起来case(led_ctrl_cnt)  // case/endcase 中就是case语法块, default是默认分支2'b00: leg <= 4'b0001;2'b01: leg <= 4'b0010;2'b10: leg <= 4'b0100;2'b11: leg <= 4'b1000;default:;endcaseend
    end
    endmodule
    
  6. 关键字

    编号12345
    1andalwaysassignbeginbuf
    2bufif0bufif1casecasexcasez
    3cmosdeassigndefaultdefparamdisable
    4edgeelseendendcaseendfunction
    5endprimitiveendmoduleendspecifyendtableendtask
    6eventforforceforeverfork
    7functionhighz0highz1ififnone
    8initialinoutinputintegerjoin
    9largemacromodulemediummodulenand
    10negedgenornotnotif0notif1
    11nmosoroutputparameterpmos
    12posedgeprimitivepulldownpulluppull0
    13pull1rcmosrealrealtimereg
    14releaserepeatrnmosrpmosrtran
    15rtranif0rtranif1scalaredsmallspecify
    16specparamstrengthstrong0strong1supply0
    17supply1tabletasktrantranif0
    18tranif1timetritriandtrior
    19triregtri0tri1vectoredwait
    20wandweak0weak1whilewire
    21worxnorxor

    常用关键字

    关键字含义
    module模块开始定义
    input输入端口定义
    output输出端口定义
    inout双向端口定义
    parameter信号的参数定义
    wirewire 信号定义
    regreg 信号定义
    always产生 reg 信号语句的关键字
    assign产生 wire 信号语句的关键字
    begin语句的起始标志
    end语句的结束标志
    posedge/negedge 时序电路的标志
    caseCase 语句起始标记
    - casexCase 语句起始标记, 不考虑高阻状态 z
    -casezCase 语句起始标记, 不考虑高阻状态 z 和不定值 x
    defaultCase 语句的默认分支标志
    endcaseCase 语句结束标记
    ifif/else 语句标记
    elseif/else 语句标记
    forfor 语句标记
    endmodule模块结束定义
  7. 事件触发器
    initial 语句块, 只在初始化时执行一次
    always 语句块, 每次时钟周期都执行, 条件可以是电平触发, 时钟触发, 或两者都触发

  8. verilog 类型 wire/reg

    wire 类型: 模块输入类型, 顶层模块输出, 部分内部模块输出, 实例化模块的连接, 被 assign 赋值的对象
    reg 类型: always/initial 内被赋值的变量, 部分内部模块输出.

PS: 语言只是逻辑的描述, verilog 语言就是硬件语言的逻辑描述,


参考

  1. Verilog 基础知识
  2. Verilog 的关键字
  3. tinyriscv
  4. 浅显易懂-Verilog 中什么时候用 wire?什么时候用 reg?wire 与 reg 只有又有啥区别?如何去选择性的使用呢?
  5. verilog 基础——always、initial

http://www.ppmy.cn/news/1442719.html

相关文章

Java基础知识总结(77)

* 2、JMM模型 JMM&#xff08;Java Memory Model&#xff09;&#xff1a;Java 内存模型&#xff0c;是 Java 虚拟机规范中所定义的一种内存模型&#xff0c;Java 内存模型是标准化的&#xff0c;屏蔽掉了底层不同计算机的区别。也就是说&#xff0c;JMM 是 JVM 中定义的一种并…

(五)小案例银行家应用程序-实现转账

现在我们想实现用户之间相互转账的功能&#xff1b; ● 和之前一样我们还是要通过这个点击&#xff0c;页面元素一再写在变量里面了 在这里插入图片描述 btnTransfer.addEventListener(click, function (e) {e.preventDefault();const amount Number(inputTransferAmount.val…

python_django农产品物流信息服务系统6m344

Python 中存在众多的 Web 开发框架&#xff1a;Flask、Django、Tornado、Webpy、Web2py、Bottle、Pyramid、Zope2 等。近几年较为流行的&#xff0c;大概也就是 Flask 和 Django 了 Flask 是一个轻量级的 Web 框架&#xff0c;使用 Python 语言编写&#xff0c;较其他同类型框…

民航电子数据库:报错merge sql error, dbType null, druid-1.1.9, sql : xxx

目录 一、场景二、SQL三、报错信息四、排查五、原因六、解决 一、场景 1、对接民航电子数据库 2、limit查询时报错 二、SQL SELECT openid,headimgurl,nickname FROM t_mb_weixinuser WHERE openid? AND vdnId ? LIMIT 1三、报错信息 merge sql error, dbType null, dru…

iOS - Runloop在实际开发中的应用

文章目录 iOS - Runloop在实际开发中的应用1. 控制线程生命周期&#xff08;线程保活&#xff09;2. 解决NSTimer在滑动时停止工作的问题2.1. 案例2.2 解决 3. 监控应用卡顿4. 性能优化 iOS - Runloop在实际开发中的应用 1. 控制线程生命周期&#xff08;线程保活&#xff09;…

MySQL--创建,删除,查找,案例

1.数据库的---创建&#xff0c;删除&#xff0c;查找&#xff0c;案例 create database 数据库名称; # 创建一个数据库&#xff0c;所有参数默认 create database 数据库名称 [default chasetutf8mb4] # 创建的同时指定了编码2.drop删除 drop database 数据库名称;3.进入数据库…

ubuntu22.04安装TensorRT(过程记录)

重要说明&#xff1a;此贴经过多次修改。第一次安装的的为trt8.6.1版本。第二次安装的10.0.0.6版本。有些地方可能没改过来&#xff0c;比如链接向导&#xff0c;我懒得改了&#xff0c;但是流程是对的。 cuda和cudnn版本对应关系 tensorRT历史发行版本 CUDA历史发行版本 cudn…

MySql 查询优化

MySQL查询优化涉及多个方面&#xff0c;包括索引优化、查询优化、服务器配置优化等。以下是一些基本的查询优化技巧&#xff1a; 1.使用索引 确保你的查询利用了适当的索引。 SELECT * FROM table_name WHERE column_name value; 2.避免SELECT * 只选择需要的列&#xff…