FPGA笔记1——Verilog语法
目录
一、Verilog基础语法
1.1 逻辑值:
1.2 数字进制:
1.3 标识符
1.4 数据类型:
寄存器
线网
参数类型
1.5 运算符
二、Verilog程序框架
2.1 注释
2.2 关键字
2.3 模块的结构
2.4 模块的调用
三、Verilog高级知识点
3.1 赋值语句
3.2 结构语句
initial
always
3.3 条件语句
if_else 语句
case语句(多分支选择语句)
四、状态机
4.1 概念与模型
4.2 状态机设计
1、状态空间定义
2、状态跳转
3、下个状态判断
4、各个状态下的动作
一、Verilog基础语法
1.1 逻辑值:
0、1、X(不定)、Z(高阻态 悬空状态)
1.2 数字进制:
二进制 b:4’b0101 四位二进制数字0101
八进制 o
十进制 d:4'd2 四位十进制数2(二进制0010)
十六进制 h:4'ha 四位十六进制数a(二进制1010)
若未指定,默认32'd(前面的位数是指二进制的位数)
1.3 标识符
用于定义模块名、端口名、信号名
任意一组字母、数字、&、_的组合
- 第一个字符必须是字母或者下划线
- 区分大小写,不建议大小写混合使用
- 普通内部信号建议全部小写
推荐:sum cpu_addr clk_50 clk_cpu
1.4 数据类型:
寄存器
关键字reg 默认初始值x
//reg difine
reg[31:0] delay_cnt; //延时计数,32位寄存器(0~31),指定位宽时高位在前
reg key_reg; //未指定位宽,默认为1
只能在always、initial语句中被赋值
若时序逻辑,always语句带时钟信号,该寄存器为触发器
若组合逻辑,always语句不带时钟信号,该寄存器对应变量为硬件连接
线网
表示结构实体之间的物理连线
关键字wire/tri 不能存储值,是由驱动他的元件(门、连续赋值语句、assign)决定的,若无驱动,则默认为高阻
//wire define
wire key_flag; //按键标志,默认1位
参数类型
即常量用parameter定义
//parameter define 4.3'RGB LCD
parameter H_SYNC = 11'd41; //行同步。可以一次定义多个参数,参数参数之间需要用逗号隔开
常用于定义状态机的状态、数据位宽、延迟大小。
1.5 运算符
算数运算符:+ - * /(整除,只保留整数部分) %(模除,求余)
关系运算符:>,<, <=,>=,==,!=
逻辑运算符:!a, a&&b, a||b
条件运算符:?:(a?b:c 如果啊为正,就选择b,否则选择c)
result = (a>=b)?a:b; //a,b取高位
位运算符:~a, a&b, a|b, a^b (若两变量位宽不同,小位宽前补零)
移位运算符:a<<b(a左移b位),a>>b(a右移b位)
用0填补移出的空位:
4'b1001<<2=6'b100100(位宽增加)
4'b1001>>1=4'b0100(最后一位丢弃,空位用0补齐)
拼接运算符:{a,b}(将a和b拼接起来,作为一个新的信号)
c[11:0]= { a[7:0],b[3:0] }
运算符的优先级
二、Verilog程序框架
2.1 注释
注释方式:
//本行
/*可以拓展
到多行*/
2.2 关键字
2.3 模块的结构
基本设计单元:模块block
一部分描述接口,另一部分描述逻辑
每个Verilog程序包括4个主要部分:
端口定义、IO说明、内部信号声明、功能定义
module block(a,b,c,d); //定义模块名和端口列表//IO说明input a,b;output c,d;//功能定义:生成一个或门一个与门assign c = a | b;assign d = a & b;endmodule
//这是一个可综合模块
//流水灯举例
功能定义部分的三种方法:
- assign语句:描述组合逻辑(如上)
- always语句:描述组合/时序逻辑
- 例化实例元件 e.g: and #2 u1(q,a,b); //例化了一个与门
以上三种逻辑功能是并行的。
注意:在always块中,逻辑是顺序执行的;但每个always块之间是并行的。
2.4 模块的调用
在模块调用(例化)时,信号通过模块端口在模块之间传递
两种方式:
1、按照名称的连接(如图左,注意参数即赋予新的值)
2、按照位置排列的连接(如图右,顺序不能错)
调用时要命名新的模块名,一般用u_<module_name>
三、Verilog高级知识点
3.1 赋值语句
过程赋值语句:
①阻塞过程性赋值(=)Blocking:
只有一个步骤的操作:计算R并更新L。
语句间按照顺序执行,后面的赋值语句是在赋值语句结束后才开始赋值。
②非阻塞过程性赋值(<=)Non_Blocking:
看作是两个步骤:(a)赋值开始,计算R;(b)赋值结束,更新L。
执行时计算右侧表达式,同时允许继续执行下一条语句(语句间并行运行)。在未来时刻将值赋予左边,最快也要在当前时刻结束前的最后一刻(语句中没有延时)
只能用于对寄存器类型(reg)的变量进行赋值,因此只能用在initial块和always块里。
一般使用原则:
过程赋值语句可以选择带有一个延迟,延迟:
①语句间延迟:开始执行本条语句需要等待的时间
sum=(a^b)^cin;
#4 t1 = a & cin;
②语句内延迟:右式计算出值后到左式被赋予该值之间的时间
sum = #3 (a^b)^cin; //首先计算右边的值,等待三个单位后赋值给左边
3.2 结构语句
initial
在模块中只执行一次,常用于测试(仿真)文件编写,用于产生激励信号,或用于对存储变量赋初值
always
语句一直在不断重复,但只有和一定时间控制结合在一起才有用
时间控制可以是沿触发也可以是电平触发;可以是多个信号(之间用or连接)(称为敏感列表)
- 沿触发举例
沿触发的always块常用于描述时序逻辑行为
上升沿触发 posedge 下降沿触发 negedeg
always语句后的过程块(顺序块)是否运行要看触发条件是否满足
- 电平触发
沿触发的always块常用于描述组合逻辑行为
只要(*)中电平发生了变化,就执行一次
- 复习:
组合逻辑电路:任意时刻的输出仅仅取决与该时刻的输入,与原来状态无关
时序逻辑电路:任一时刻的输出不仅取决于当前的输入信号,还取决于电路原来的状态。必须具有记忆功能(存储器)。
3.3 条件语句
必须在过程块(由initial和always引导的块语句)中使用
if_else 语句
① if (a>b)
out = data_1;
②if (a>b)
out = data_1;
else
out = data_2;
③ if (表达式1)
语句1;
else if (表达式2)
语句2;
else if(表达式3)
语句3;
else
语句4
- 简写:if(a) —— if(a==1)
- if判断:0、x、z假;1真
- if和else后面的操作语句可以用begin和end包含多个语句
- 允许if语句嵌套
case语句(多分支选择语句)
case(控制表达式)
分支表达式1
分支表达式2
分支表达式3
……
default ……
endcase
看控制表达式是否等于分支表达式,并执行相应程序
- 分支表达式的值互不相同
- 所有表达式位宽必须相同
- casez比较时,不考虑表达式中的高阻值
- casex比较时,不考虑高阻值z和不定值x
四、状态机
4.1 概念与模型
有限状态机:在有限个状态之间按一定规律转换的时序电路(如序列检测器)
状态寄存器由一组触发器组成,用来记忆状态机当前所处状态,状态的额改变只发生在时钟的跳变沿。
两种模型:
4.2 状态机设计
遵循四段论:
1、状态空间定义
//define state space 用二进制数定义状态
parameter SLEEP = 2'b00;
parameter STUDY = 2'b01;
parameter EAT = 2'b10;
parameter AMUSE = 2'b11;//internal variable 相当于定义状态寄存器,用来存储状态,位宽与参数保持一致
reg [1:0] current_state;
reg [1:0] next_state;//独热码(每个状态只有一个寄存器置位,译码逻辑简单)编码方式:
//define state space
parameter SLEEP = 4'b1000;
parameter STUDY = 4'b0100;
parameter EAT = 4'b0010;
parameter AMUSE = 4'b0001;//internal variable
reg [3:0] current_state;
reg [3:0] next_state;
2、状态跳转
(时序逻辑)
3、下个状态判断
(组合逻辑)
latch:锁存器(case语句不全/有if没有对应else)
4、各个状态下的动作
三段式可以在组合逻辑后增加一级寄存器来实现时序逻辑输出
源视频来自b站正点原子开拓者FPGA开发板视频
FPGA笔记1——Verilog语法相关推荐
- FPGA笔记之verilog语言(基础语法篇)
文章目录 FPGA笔记之verilog语言(基础语法篇) 1. verilog 的基础结构 1.1 verilog设计的基本单元--module 1.2 module的使用 1.3 I/O的说明 1. ...
- FPGA 40 专题 verilog语法编程规范
FPGA 40 专题 verilog语法编程规范 在这里主要是给自己写一个备忘录,加强个人记忆. 详细可以参考地址1:https://www.runoob.com/w3cnote/verilog2-c ...
- Cyclone FPGA踏足笔记(二):Verilog语法学习总结
欢迎来我的个人博客:https://codinglover.top/ 转转! 前言 花了一个月时间零零碎碎看了下Verilog的语法,终于把Verilog的基本语法学了个大概,可以自己写点小东西了,由 ...
- Josh 的学习笔记之 Verilog(Part 4——RTL 概念与常用 RTL 建模)
文章目录 1. RTL 和综合 2. RTL 级的基本要素和设计步骤 3. 常用 RTL 级建模 3.1 非阻塞赋值.阻塞赋值.连续赋值 3.2 寄存器电路建模 3.3 组合逻辑建模 3.4 双线端口 ...
- 【杂谈】FPGA之路——Verilog与编辑器的那些事儿
目录 前言 「 Verilog与Notepad++ 」 「 Verilog与Sublime Text3」 「 Verilog与VS Code」 「 Verilog与Vim」 「 重拾旧爱Notepad ...
- [转]verilog语法学习心得
verilog语法学习心得 1.数字电路基础知识: 布尔代数.门级电路的内部晶体管结构.组合逻辑电路分析与设计.触发器.时序逻辑电路分析与设计 2.数字系统的构成: 传感器 AD 数字处理器 D ...
- Verilog语法-005—宏定义
Verilog语法-005-宏定义 1.Verilog宏定义-`ifdef `ifndef `ifdef FOR_FPGA //如果定义了FOR_FPGA宏,则会执行如下 语句/或者没有语句 `els ...
- Verilog语法和典型电路
这里写目录标题 Verilog语法知识 Q:锁存器 Q:D触发器 Q:消除毛刺 Q:同步复位和异步复位 Q:边沿检测 Q:握手信号 Q:脉冲展宽(单bit慢采快) Q:二进制与格雷码的转换 Q:二进制 ...
- Verilog语法之变量
本文转自知乎罗成的Verilog语法之三:变量 总的文章链接地址小白如何快速入门Verilog 本文首发于微信公众号"花蚂蚁",想要学习FPGA及Verilog的同学可以关注一下. ...
最新文章
- 仿百度文库方案[openoffice.org 3+swftools+flexpaper](三) 之 使用JODConverter将office文档转换为pdf...
- 2018.11.06-知识回顾
- easyui datagrid 表格 属性和方法
- webpack最简单的入门教程里bundle.js之运行单步调试的原理解析
- 切换tab页时,tab页中的echart变形问题
- linux 上传网页,Windows和Linux主机FTP上传网页注意事项
- 开发人员怎么看实施人员
- Ubuntu下用apache+perl搭建最简单的聊天室
- C语言中输入输出fread和fwrite函数的用法
- 华为云发起美食图片分类大赛!奖品丰厚还可免费使用云资源
- 移动端网站如何开发(电脑端网站到手机端网站我们需要在html代码中添加哪个meta标签)...
- access 跳过一次for循环_Java中的循环结构
- ERP进销存系统源码
- R语言使用mad函数、median函数、mean函数计算向量数据的中位数绝对偏差、中位数、均值、数据中包含NA值的情况
- 「笔耕不辍」zookeeper的节点加密方式及分布式锁实现过程
- Autoleaders控制组——叶睿 第三次任务
- java实现图片的压缩且保留图片尺寸不变
- 史上Windows快捷键大全
- 4维俄罗斯方块 java,课内资源 - 基于Easyx插件的俄罗斯方块游戏的设计与实现
- 守望者的逃离(贪心,动态规划)
热门文章
- prometheus+grafana可视化实时jvm监控工具
- qpython3h第三方库安装_Python第三方库安装
- 如何在Ubuntu部署tftp服务器
- python库名_在python存储库名称和包名称中使用连字符/破折号 - python
- 判断字母数字下划线python_如何验证Python中的字符串仅包含字母,数字,下划线和破折号?...
- 接口测试用例的设计和执行
- Mac 使用 mysqlclient 报错 NameError: name ‘_mysql‘ is not defined
- Leaflet绘制全球地震数据热力图
- 弹道导弹预警仿真系统中弹道构造方法
- 基于最小二乘、迭代和相位梯度校正的解包裹算法实例分析