目录

一、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 标识符

用于定义模块名、端口名、信号名

任意一组字母、数字、&、_的组合

  1. 第一个字符必须是字母或者下划线
  2. 区分大小写,不建议大小写混合使用
  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
//这是一个可综合模块

//流水灯举例

功能定义部分的三种方法:

  1. assign语句:描述组合逻辑(如上)
  2. always语句:描述组合/时序逻辑
  3. 例化实例元件        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

  1. 简写:if(a) —— if(a==1)
  2. if判断:0、x、z假;1真
  3. if和else后面的操作语句可以用begin和end包含多个语句
  4. 允许if语句嵌套

case语句(多分支选择语句)

case(控制表达式)

分支表达式1

分支表达式2

分支表达式3

……

default ……

endcase

看控制表达式是否等于分支表达式,并执行相应程序

  1. 分支表达式的值互不相同
  2. 所有表达式位宽必须相同
  3. casez比较时,不考虑表达式中的高阻值
  4. 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语法相关推荐

  1. FPGA笔记之verilog语言(基础语法篇)

    文章目录 FPGA笔记之verilog语言(基础语法篇) 1. verilog 的基础结构 1.1 verilog设计的基本单元--module 1.2 module的使用 1.3 I/O的说明 1. ...

  2. FPGA 40 专题 verilog语法编程规范

    FPGA 40 专题 verilog语法编程规范 在这里主要是给自己写一个备忘录,加强个人记忆. 详细可以参考地址1:https://www.runoob.com/w3cnote/verilog2-c ...

  3. Cyclone FPGA踏足笔记(二):Verilog语法学习总结

    欢迎来我的个人博客:https://codinglover.top/ 转转! 前言 花了一个月时间零零碎碎看了下Verilog的语法,终于把Verilog的基本语法学了个大概,可以自己写点小东西了,由 ...

  4. Josh 的学习笔记之 Verilog(Part 4——RTL 概念与常用 RTL 建模)

    文章目录 1. RTL 和综合 2. RTL 级的基本要素和设计步骤 3. 常用 RTL 级建模 3.1 非阻塞赋值.阻塞赋值.连续赋值 3.2 寄存器电路建模 3.3 组合逻辑建模 3.4 双线端口 ...

  5. 【杂谈】FPGA之路——Verilog与编辑器的那些事儿

    目录 前言 「 Verilog与Notepad++ 」 「 Verilog与Sublime Text3」 「 Verilog与VS Code」 「 Verilog与Vim」 「 重拾旧爱Notepad ...

  6. [转]verilog语法学习心得

    verilog语法学习心得 1.数字电路基础知识: 布尔代数.门级电路的内部晶体管结构.组合逻辑电路分析与设计.触发器.时序逻辑电路分析与设计 2.数字系统的构成: 传感器  AD  数字处理器  D ...

  7. Verilog语法-005—宏定义

    Verilog语法-005-宏定义 1.Verilog宏定义-`ifdef `ifndef `ifdef FOR_FPGA //如果定义了FOR_FPGA宏,则会执行如下 语句/或者没有语句 `els ...

  8. Verilog语法和典型电路

    这里写目录标题 Verilog语法知识 Q:锁存器 Q:D触发器 Q:消除毛刺 Q:同步复位和异步复位 Q:边沿检测 Q:握手信号 Q:脉冲展宽(单bit慢采快) Q:二进制与格雷码的转换 Q:二进制 ...

  9. Verilog语法之变量

    本文转自知乎罗成的Verilog语法之三:变量 总的文章链接地址小白如何快速入门Verilog 本文首发于微信公众号"花蚂蚁",想要学习FPGA及Verilog的同学可以关注一下. ...

最新文章

  1. 仿百度文库方案[openoffice.org 3+swftools+flexpaper](三) 之 使用JODConverter将office文档转换为pdf...
  2. 2018.11.06-知识回顾
  3. easyui datagrid 表格 属性和方法
  4. webpack最简单的入门教程里bundle.js之运行单步调试的原理解析
  5. 切换tab页时,tab页中的echart变形问题
  6. linux 上传网页,Windows和Linux主机FTP上传网页注意事项
  7. 开发人员怎么看实施人员
  8. Ubuntu下用apache+perl搭建最简单的聊天室
  9. C语言中输入输出fread和fwrite函数的用法
  10. 华为云发起美食图片分类大赛!奖品丰厚还可免费使用云资源
  11. 移动端网站如何开发(电脑端网站到手机端网站我们需要在html代码中添加哪个meta标签)...
  12. access 跳过一次for循环_Java中的循环结构
  13. ERP进销存系统源码
  14. R语言使用mad函数、median函数、mean函数计算向量数据的中位数绝对偏差、中位数、均值、数据中包含NA值的情况
  15. 「笔耕不辍」zookeeper的节点加密方式及分布式锁实现过程
  16. Autoleaders控制组——叶睿 第三次任务
  17. java实现图片的压缩且保留图片尺寸不变
  18. 史上Windows快捷键大全
  19. 4维俄罗斯方块 java,课内资源 - 基于Easyx插件的俄罗斯方块游戏的设计与实现
  20. 守望者的逃离(贪心,动态规划)

热门文章

  1. prometheus+grafana可视化实时jvm监控工具
  2. qpython3h第三方库安装_Python第三方库安装
  3. 如何在Ubuntu部署tftp服务器
  4. python库名_在python存储库名称和包名称中使用连字符/破折号 - python
  5. 判断字母数字下划线python_如何验证Python中的字符串仅包含字母,数字,下划线和破折号?...
  6. 接口测试用例的设计和执行
  7. Mac 使用 mysqlclient 报错 NameError: name ‘_mysql‘ is not defined
  8. Leaflet绘制全球地震数据热力图
  9. 弹道导弹预警仿真系统中弹道构造方法
  10. 基于最小二乘、迭代和相位梯度校正的解包裹算法实例分析