# 02 初识Verilog HDL
02 初识Verilog HDL
对于Verilog的语言的学习,我认为没必要一开始就从头到尾认真的学习这个语言,把这个语言所有细节都搞清楚也不现实,我们能够看懂当前FPGA的代码的程度就可以了,随着学习FPGA深度的增加,再不断的去查阅不会的Verilog的语法。例如下面这个流水灯的程序,请带着能够看懂这段代码的目的去开始Verilog的入门学习吧!
module flow_led(input sys_clk , input sys_rst_n, output reg [3:0] led );//reg define
reg [23:0] counter;//*****************************************************
//** main code
//***************************************************** always @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n)counter <= 24'd0;else if (counter < 24'd1000_0000)counter <= counter + 1'b1;elsecounter <= 24'd0;
endalways @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n)led <= 4'b0001;else if(counter == 24'd1000_0000) led[3:0] <= {led[2:0],led[3]};elseled <= led;
endendmodule
一. Verilog 简介
Verilog 是一种硬件描述语言,FPGA 开发主要有两种语言,Verilog 和 VHDL。 而 Verilog 更加容易上手, Verilog 是在 C 语言的基础上发展出来的。其语法也和 C 语言更加的接近,入门更加的简单,也是目前最多使用的。
特点:
1. 语法自由,易学易用。2.代码简单。3.发展速度快。3.适合算法级,门级设计。
二. Verilog 基础语法
1.逻辑值
(1) 0:低电平
(2) 1:高电平
(3) z : 高阻态
(4) x:未知状态
2. 关键字
module endmodule input outpt inout
2.2 变量
Verilog 最常用的 2 种数据类型就是线网(wire)与寄存器(reg)。
wire : 直接的连接,会被映射成真实的物理连接,表示硬件单元之间的物理连线,由其连接的器件输出端连续驱动。
**reg:**某一时间点状态的保持,会被映射成物理寄存器,用来表示存储单元,它会保持数据原有的值,直到被改写
reg [3:0] counter ; //声明4bit位宽的寄存器counter
wire [32-1:0] gpio_data; //声明32bit位宽的线型变量gpio_data
2.3 参数
二者之间有区别和联系,使用到再详细结介绍。
parameter:
localparam:
2.4 常量
表示格式 :[换算成二进制后的总长度]'[数制进制符号][与数值进制符号对应的数值]
8’d171: 位宽为 8,十进制的 171.
直接写 100,就表示 32’d100,模式是 10 进制 32 位宽,这是 verliog 中默认的。
3.赋值方式
Verliog 中的赋值方式有两种 阻塞赋值 和 非阻塞赋值。
阻塞赋值
a=1;b=2;
顺序执行,当执行完 a=1,才去执行 b=2;
非阻塞赋值
a<=1;b<=2;
两条语句是同时执行的。
4.常用的语句
过程结构语句有 2 种,initial 与 always 语句。它们是行为级建模的 2 种基本语句。
一个模块中可以包含多个 initial 和 always 语句,但 2 种语句不能嵌套使用。
这些语句在模块间并行执行,与其在模块的前后顺序没有关系。
但是 initial 语句或 always 语句内部可以理解为是顺序执行的(非阻塞赋值除外)。
每个 initial 语句或 always 语句都会产生一个独立的控制流,执行时间都是从 0 时刻开始。
4.1 always
4.2 initial
只在仿真文件中使用,不可综合的。
4.2 if else
和 c 语言中的使用一致。
if():
else():
4.3 case
在 c 语言的基础上,在结束的时候需要添加一个 endcase。
case() <> : 语句1;<> : 语句2;default :
endcase
4.4 assign( 全加器)
4.5 @(事件控制)
语句执行的条件是信号的值发生特定的变化。
关键字 posedge 指信号发生边沿正向跳变,negedge 指信号发生负向边沿跳变,未指明跳变方向时,则 2 种情况的。
5. 常用的运算符
基础的运算符的使用和 c 语言中大概相同,使用到的时候如果不会,自己复习一下就好,这里说明不常见的运算符,但在 Verliog 中经常使用到的。
5.1 位拼接运算符 {}
d = { a, b, c} // 将 a,b,c按顺序拼接成了d,注意的是a,b,c,d的宽度一定要符合。
5.2 条件运算符 ? :
也就是 c 语言中的三目运算符。
表达式1?表达式2:表达式3
如果表达式 1 为真,就执行 2,否则执行 3.
6. 系统函数
verliog 中系统预定义一些函数,完成特殊的功能,以下就是经常使用到的一些系统函数。
·timescale 1ns/1ns //时间尺度预编译指令 时间单位/时间精度
$display("%d",1); //用于输出,类似c语言中的print
$write("\n",1); //用于输出,和display一样,但是display可以自动换行,wirte需要换行符
#1 //表示延时的时间
$stop; //暂停仿真
$finish; //结束仿真
$time; //返回64位的当前时间
以反引号 ` 开始的某些标识符是 Verilog 系统编译指令。
相关文章:
# 02 初识Verilog HDL
02 初识Verilog HDL 对于Verilog的语言的学习,我认为没必要一开始就从头到尾认真的学习这个语言,把这个语言所有细节都搞清楚也不现实,我们能够看懂当前FPGA的代码的程度就可以了,随着学习FPGA深度的增加,再不断的…...
使用 Eziriz .NET Reactor 对c#程序加密
我目前测试过好几个c#加密软件。效果很多时候是加密后程序执行错误,或者字段找不到的现象 遇到这个加密软件用了一段时间都很正常,分享一下使用流程 破解版本自行百度。有钱的支持正版,我用的是 Eziriz .NET Reactor 6.8.0 第一步 安装 Ezi…...
Restclient-cpp库介绍和实际应用:爬取www.sohu.com
概述 Restclient-cpp是一个用C编写的简单而优雅的RESTful客户端库,它可以方便地发送HTTP请求和处理响应。它基于libcurl和jsoncpp,支持GET, POST, PUT, PATCH, DELETE, HEAD等方法,以及自定义HTTP头部,超时设置,代理服…...
提升市场调研和竞品分析效率:利用Appium实现App数据爬取
市场调研和竞品分析通常需要获取大量的数据,而手动收集这些数据往往耗时且容易出错。而利用Appium框架,我们可以轻松地实现自动化的App数据爬取,这种方法不仅可以节省时间和人力成本,还可以提高数据的准确性和一致性。 Appium是一…...
【Git笔记】之Git重命名详解
目录 一、Git重命名文件 二、Git重命名origin 三、Git重命名分支 四、Git重命名远程分支 五、Git重命名作者 六、Git clone重命名 七、Git重命名仓库 八、Git重命名文件夹后出现两个代码 九、Git重命名文件名 Git是一个非常流行的版本控制工具,它可以帮助程…...
201、RabbitMQ 之 Exchange 典型应用模型 之 工作队列(Work Queue)
目录 ★ 工作队列介绍代码演示测试注意点1:注意点2: ★ 工作队列介绍 工作队列: 就是让多个消费者竞争消费同一个消息队列的消息,相当于多个消费者共享消息队列。 ▲ RabbitMQ可以让多个消费者竞争消费同一个消息队列 ▲ 消息队…...
了解三层架构:表示层、业务逻辑层、数据访问层
目录 背景: 三层架构 什么是三层: 分层的目的: 三层的结构关系编辑 三层表现形式:编辑 三层的优缺点: 总结: 背景: 三层架构是一种软件设计模式,可称为客户端-服务器-架构,把各个功能模块划分…...
三相空气开关
一、三相空开的作用 三相空气开关对任意一相出现过载或短路,均起到保护作用。 二、三相空气开关原理图: 1、老式空气开关 1)、短路时,电磁脱钩器工作 2)、过载时,发热元件引起双金属片弯曲,使脱钩器工作 3)、测试按…...
uniapp 单位rpx ,设计稿尺寸px处理方式
1.使用postcss-px2rpx 插件做全局的单位转换 npm install postcss-px2rpx -D npm 安装 2.postcss.config.js修改 module.exports {plugins: {postcss-px2rpx: {// 设计稿宽度,默认750designWidth: 750,// 需要转换的最小像素值,默认1pxminPixelValue: 1…...
@所有燃气企业,城燃企业数字化转型重点抓住的八个关键点
关键词:智慧燃气、燃气数字化、设备设施数字化 数字化转型是用信息技术全面重塑企业经营管理模式,是企业发展模式的变革创新,是企业从工业经济时代迈向数字经济时代的必然选择。加快推进企业数字化转型,打造数字时代企业业务运行…...
大数据学习(4)-hive表操作
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博>主哦&#x…...
第二证券:汇金增持有望催化银行板块 白酒企稳信号凸显
昨日,两市股指盘中震动上扬,创业板指、科创50指数一度涨超1%,但沪指午后涨幅逐渐回落。到收盘,沪指涨0.12%报3078.96点,深成指涨0.35%报10084.89点,创业板指涨0.8%报2003.9点,科创50指数涨1.29%…...
Kubernetes使用OkHttp客户端进行网络负载均衡
在一次内部Java服务审计中,我们发现一些请求没有在Kubernetes(K8s)网络上正确地实现负载均衡。导致我们深入研究的问题是HTTP 5xx错误率的急剧上升,由于CPU使用率非常高,垃圾收集事件的数量很多以及超时,但…...
oracle设置自增ID
CREATE SEQUENCE 序列名 START WITH 1 INCREMENT BY 1 MINVALUE 1 ORDER NOCYCLE; //CREATE SEQUENCE “QMS”.“Untitled” MINVALUE 1 INCREMENT BY 1 START WITH 1 ORDER NOCACHE 创建触发器: create or replace trigger 触发器名 before insert on “表名” fo…...
ubuntu22.04设置中文
安装了中文语言包。 sudo apt-get install language-pack-zh-hans将系统的默认语言设置为中文 sudo update-locale LANGzh_CN.UTF-8添加环境 /etc/profile 最后中添加 export LANGzh_CN.utf8 export LC_CTYPE"zh_CN.utf8"可以在~/.bashrc文件后面也加上...
Java中 创建不可变集合
常规写法 以往我们创建一些不可变集合的时候,通常是这样写的: // 不可变的Set Set<String> set new HashSet<>(); set.add("a"); set.add("b"); set.add("c"); set Collections.unmodifiableSet(set); //…...
options.css 内容优化2 --chatPGT
问: options.css 内容优化,功能列表的li,设置成点击按钮的样式,需要有鼠标经过高亮,选中时按钮背景颜色和未选中时的背景色需要有肉眼可见的色差 gpt: 为了使左侧功能列表的每个 <li> 元素看起来像按钮,并且在鼠标经过时…...
MS4344:24bit、192kHz 双通道数模转换电路
MS4344 是一款立体声数模转换芯片,内含插值滤波器、 multi-bit 数模转换器、输出模拟滤波器。 MS4344 支持大部分 的音频数据格式。 MS4344 基于一个带线性模拟低通滤波器的 四阶 multi-bit Δ-Σ 调制器,而且本芯片可以通过检测信号频率 和主时钟频…...
Talk | ACL‘23 杰出论文,MultiIntruct:通过多模态指令集微调提升VLM的零样本学习
本期为TechBeat人工智能社区第536期线上Talk! 北京时间10月11日(周三)20:00,弗吉尼亚理工大学博士生—徐智阳、沈莹的Talk已准时在TechBeat人工智能社区开播! 他们与大家分享的主题是: “通过多模态指令集微调提升VLM的零样本学习”ÿ…...
PLC编程速成(二)
目录 操作符 什么是操作符? 变量表(数据类型) 常用的类型: 变量表图 设置复位指令 如何重复双线圈与解决复双线圈问题? 解决复双线圈 编辑 重复双线圈 置复位指令(有置位就存在复位)…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
