FPGA开发verilog语法基础3

文章目录

  • 主体内容
    • 1 模块的结构与调用
    • 2 语句
      • 2.1 结构语句
        • 2.1.1 initial语句
        • 2.1.2 always语句
      • 2.2 赋值语句
        • 2.2.1 阻塞赋值(=)
        • 2.2.2 非阻塞赋值(<=)
      • 2.3 条件语句
        • 2.3.1 if 语句
        • 2.3.2 case 语句
    • 3 状态机
      • 3.1 状态空间定义
      • 3.2 状态跳转
      • 3.3 下个状态判断
      • 3.4 各个状态下的动作
      • 3.5 状态机实例
  • 参考资料

主体内容

1 模块的结构与调用

       Verilog 的基本设计单元是“模块”(block)。

       一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能

//描述接口部分
module block(a,b,c,d);		//(a,b,c,d)是端口定义input a,b;				//IO说明output c,d;//描述逻辑功能
assign c = a | b;
assign d = a & b;endmodule

​       每个Verilog程序包括4个主要的部分:端口定义IO说明内部信号声明功能定义。但其实端口定义和IO说明可以放到一起写,如下:

module flow_led(input sys_clk,input sys_rst_n,output reg [3:0] led);...endmoudle

       注意!在Verilog中,当你定义一个模块的输入输出端口时,如果不显式地指定数据类型,那么这些端口默认的数据类型是wire;output 信号可以是 wire 类型,也可以是 reg 类型(条件是在 always 或 initial 语句中被赋值);inout 一般为 tri(三态线)类型,表示有多个驱动源

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

​       1,assign语句 描述组合逻辑

       2,always语句 描述组合/时序逻辑

       3,例化实例元件 如:and #2 u1(q,a,b),这里的and是一个与门(verilog的关键字之一)

​       上述三种逻辑功能是并行的。注意!!!在always块中,逻辑是顺序执行的,而在多个always块之间并行的。

       在模块进行调用时,注意,输入可以是reg类型或者wire类型,但输出则必须是wire类型(因为其表示结构实体(例如门)之间的物理连线)

在这里插入图片描述

       特别注意!如果例化的模块有参数的话,参数的例化要在"u_"之前

2 语句

2.1 结构语句

2.1.1 initial语句

       initial 语句它在模块中只执行一次

​       它常用于测试文件的编写,用来产生仿真测试信号(激励信号),或者用于对存储器变量赋初值

2.1.2 always语句

       always语句一直在不断地重复运行,但是只有和一定的时间控制结合在一起才有作用。

​       always 的时间控制可以是沿触发,也可以是电平触发。可以是单个信号,也可以是多个信号,多个信号中间要用关键字 or 连接。(由关键词 or 连接的多个事件名或信号名组成的列表称为“敏感列表”。)always 语句后紧跟的过程块是否运行,要看它的触发条件是否满足。

       沿触发的 always 块常常描述时序逻辑行为。

​       !穿插组合逻辑与时序逻辑的差别:

       组合逻辑电路中,任意时刻的输出仅仅取决于该时刻的输入与电路原来的状态无关

​       时序逻辑电路中,任一时刻的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态。或者说还与以前的输入有关,因此时序逻辑必须具备记忆功能。

2.2 赋值语句

​       Verilog HDL 语言中,信号有两种赋值方式,分别位阻塞赋值(blocking)和非阻塞赋值(Non blocking)。

2.2.1 阻塞赋值(=)

       阻塞赋值可以认为只有一个步骤的操作,即计算 RHS 并更新 LHS 。所谓阻塞的概念是指,在同一个always块中,后面的赋值语句是在前一句赋值语句结束后才开始赋值的

2.2.2 非阻塞赋值(<=)

       非阻塞赋值的操作过程可以看作两个步骤: (1) 赋值开始的时候,计算 RHS ;(2) 赋值结束的时候,更新 LHS 。所谓非阻塞的概念是指,在计算非阻塞赋值的RHS以及更新LHS期间,允许其他的非阻塞赋值语句同时计算RHS和更新LHS。非阻塞赋值只能用于对寄存器类型的变量进行赋值,因此只能用在initial块和always块等过程块中。

2.3 条件语句

2.3.1 if 语句

​ if 语句的三种形式:

在这里插入图片描述

       注意!条件语句必须在过程块中使用,过程块语句是指initial和always语句引导的块语句

       if 语句对表达式的值进行判断,若为0, x, z,则按假处理;若为1,按真处理。

       if和else后面的操作语句可以用begin和end包含多个语句

2.3.2 case 语句

​       case 语句又叫多分支选择语句。分支表达式的值互不相同,且所有表达式的位宽必须相等。由于verilog不同于C语言,逻辑值存在x和z,故判断要复杂很多,case语句的真值表如下图所示:

在这里插入图片描述

​       注意casez为比较时不考虑表达式中的高阻值,而casex为不考虑高阻值和不定值x。它们的真值表如下图所示:

在这里插入图片描述

3 状态机

​       有限状态机(Finite State Machine,简称FSM)对应在有限个状态之间按一定规律转换的时序电路。

       两种状态机示意图如下图所示:

在这里插入图片描述

       两者唯一的区别是对于Mealy状态机而言,状态机的输出既与当前状态有关,也与输入有关;而Moore状态机的输出只与当前状态有关。所以,Moore状态机只是Mealy状态机的一个特例

​       状态机设计的四段论:1,状态空间定义;2,状态跳转;3,下个状态判断;4,各个状态下的动作。

3.1 状态空间定义

在这里插入图片描述

       这里需要注意下面定义的状态寄存器需要上面定义的参数位宽保持一致

3.2 状态跳转

​       示例:

always @(posedge clk or negedge rst_n) beginif(!rst_n)current_state <= SLEEP;elsecurrent_state <= next_state;
end

3.3 下个状态判断

在这里插入图片描述

​       其中latch值的是锁存器,在数字电路里面,latch是一个电平触发的存储器,而触发器是一个边沿触发的存储器,在verilog代码编写中,一定要避免产生无谓的锁存器,锁存器只在组合逻辑里产生,它会造成我们生成的电路毛刺比较多。其它可能产生锁存器的情况:case表达式没有完全,如3位状态寄存器,但我们只有4个状态,也就是说有的状态没有用到,那就需要给个default,否则也会生成锁存器。

3.4 各个状态下的动作

在这里插入图片描述

       注意,下面的always语句由于是组合逻辑,所以也需要使用阻塞赋值。

3.5 状态机实例

       按照上面流程写出的状态机叫做三段式状态机,一个三段式状态机的实例如下:

在这里插入图片描述

在这里插入图片描述

       而事实上,三段式状态机可以在组合逻辑后再增加一级寄存器来实现时序逻辑输出,这样做有以下三个优点:

       1,可以有效地滤去组合逻辑输出的毛刺

       2,可以有效地进行时序计算与约束

       3,另外对于总线形式的输出信号来说,容易使总线数据对齐,从而减小总线数据间的偏移,减小接收端数据采样出错的频率。

参考资料

1,正点原子领航者ZYNQ7020视频

2,《verilog HDL数字集成电路设计原理与应用(第二版)》 蔡觉平等

3,文心一言搜索结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/488750.html

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

相关文章

复原IP地址 什么是运算符重载? 如何在 C++ 中进行运算符重载?运算符重载在面向对象编程中的好处是什么?getline方法

getline方法 getline 是一个强大的函数&#xff0c;主要用于从输入流中按行读取数据或基于自定义分隔符提取字符串。它是 C 标准库的一部分&#xff0c;定义在头文件 <string> 中。 语法 std::getline(istream& input, std::string& str);input&#xff1a;输…

基于Springboot企业oa管理系统【附源码】

基于Springboot企业oa管理系统 效果如下&#xff1a; 系统主页面 用户管理页面 公告信息管理页面 客户关系管理页面 车辆信息管理页面 工资信息管理页面 文件信息管理页面 上班考勤管理页面 研究背景 随着信息化时代的到来和企业OA管理理念的更新&#xff0c;企业面临着日益…

学习记录:js算法(一百二十三):不同路径 II

文章目录 不同路径 II思路一 不同路径 II 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角&#xff08;即 grid[0][0]&#xff09;。机器人尝试移动到 右下角&#xff08;即 grid[m - 1][n - 1]&#xff09;。机器人每次只能向下或者向右移动一步。 网格中的障碍物…

[工具升级问题] 钉钉(linux版)升级带来的小麻烦

本文由Markdown语法编辑器编辑完成。 1. 背景: 今日钉钉又发布了新的升级版本。由于我工作时使用的是Ubuntu 20.04版本&#xff0c;收到的升级推送信息是&#xff0c;可以升级到最新的7.6.25-Release版本。根据钉钉官方给出的历次更新版说明&#xff0c;这个新的版本&#xf…

3.22SQL查询

实体完整性是数据库设计中的一个概念&#xff0c;指的是确保数据库中每个实体&#xff08;表&#xff09;在逻辑上是完整和一致的状态。它涉及到定义和强制执行一些规则和约束&#xff0c;以确保数据的完整性和准确性。 实体完整性通常通过以下方式来实现&#xff1a; 1. 主键…

y3编辑器教学5:触发器2 案例演示

文章目录 一、探索1.1 ECA1.1.1 ECA的定义1.1.2 使用触发器实现瞬间移动效果 1.2 变量1.2.1 什么是变量1.2.2 使用变量存储碎片收集数量并展现 1.3 if语句&#xff08;魔法效果挂接&#xff09;1.3.1 地形设置1.3.2 编写能量灌注逻辑1.3.3 编写能量灌注后&#xff0c;实现传送逻…

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 原模型 单图推理

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 原模型 单图推理 flyish 输入 输出 [‘这是一幅中国传统山水画&#xff0c;描绘了一座高耸的山峰&#xff0c;周围环绕着树木和植被。画面下方有一片开阔的田野&#xff0c;远处的山峦在薄雾中若隐若现。画面上方有几行书法…

LLM - 多模态大模型的开源评估工具 VLMEvalKit 部署与测试 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/144353087 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 VLMEva…

心觉:个人成长的密码,牛顿和量子力学已给出

Hi&#xff0c;我是心觉&#xff0c;带你用潜意识化解各种焦虑、内耗&#xff0c;建立无敌自信&#xff1b;教你财富精准显化的实操方法&#xff1b;关注我,伴你一路成长&#xff01; 每日一省写作258/1000天 在探索个人成长的奥秘时&#xff0c;你可曾想过&#xff0c;那些看似…

电子商务人工智能指南 5/6 - 丰富的产品数据

介绍 81% 的零售业高管表示&#xff0c; AI 至少在其组织中发挥了中等至完全的作用。然而&#xff0c;78% 的受访零售业高管表示&#xff0c;很难跟上不断发展的 AI 格局。 近年来&#xff0c;电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…

JS进阶DAY3|事件(三)事件委托

目录 一、事件委托 1.1 概念 1.2 代码示例 二、tab栏切换案例 一、事件委托 1.1 概念 事件委托是一种在JavaScript中常用的技术&#xff0c;它利用了DOM事件冒泡的原理。事件冒泡是指当在DOM树中较低层次的元素上发生事件时&#xff0c;这个事件会向上冒泡到更高层次的元素…

Y3编辑器文档4:触发器1(对话、装备、特效、行为树、排行榜、不同步问题)

文章目录 一、触发器简介1.1 触发器界面1.2 ECA语句编辑及快捷键1.3 参数设置1.4 变量设置1.5 实体触发器1.6 函数库与触发器复用 二、触发器的多层结构2.1 子触发器&#xff08;在游戏内对新的事件进行注册&#xff09;2.2 触发器变量作用域2.3 复合条件2.4 循环2.5 计时器2.6…

LoRA:低秩分解微调与代码

传统的微调&#xff0c;即微调全量参数&#xff0c;就是上面的公式&#xff0c;但是我们可以通过两个矩阵&#xff0c;来模拟这个全量的矩阵&#xff0c;如果原来的W是(N * N)维度&#xff0c;我们可以通过两个(N * R) 和 (R * N)的矩阵矩阵乘&#xff0c;来模拟微调的结果。 …

鸿蒙系统-前端0帧起手

鸿蒙系统-前端0帧起手 先search 一番 找到对应的入门文档1. 运行项目遇到问题 如下 &#xff08;手动设计npm 的 registry 运行 npm config set registry https://registry.npmjs.org/&#xff09;2.运行后不支持一些模拟器 配置一下&#xff08;如下图&#xff0c;运行成功&am…

Java面试之实现多线程(二)

此篇接上一篇Java面试之什么是多线程(一) Java多线程是Java语言中的一个重要特性&#xff0c;它可以实现并发处理、提高程序的性能和响应能力。开发者需要了解多线程的概念和机制&#xff0c;并采用合适的多线程编程模型和同步机制&#xff0c;以保证程序的正确性和稳定性。Jav…

酒店/电影推荐系统里面如何应用深度学习如CNN?

【1】酒店推荐系统里面如何应用CNN&#xff1f;具体过程是什么 在酒店推荐系统中应用卷积神经网络&#xff08;CNN&#xff09;并不是一个常见的选择&#xff0c;因为 CNN 主要用于处理具有空间结构的数据&#xff0c;如图像、音频和某些类型的序列数据。然而&#xff0c;在某…

三、nginx实现lnmp+discuz论坛

lnmp l&#xff1a;linux操作系统 n&#xff1a;nginx前端页面 m&#xff1a;mysql数据库&#xff0c;账号密码&#xff0c;数据库等等都保存在这个数据库里面 p&#xff1a;php——nginx擅长处理的是静态页面&#xff0c;页面登录账户&#xff0c;需要请求到数据库&#…

03篇--二值化与自适应二值化

二值化 定义 何为二值化&#xff1f;顾名思义&#xff0c;就是将图像中的像素值改为只有两种值&#xff0c;黑与白。此为二值化。 二值化操作的图像只能是灰度图&#xff0c;意思就是二值化也是一个二维数组&#xff0c;它与灰度图都属于单信道&#xff0c;仅能表示一种色调…

CV之UIGM之OmniGen:《OmniGen: Unified Image Generation》翻译与解读

CV之UIGM之OmniGen&#xff1a;《OmniGen: Unified Image Generation》翻译与解读 导读&#xff1a;这篇论文介绍了OmniGen&#xff0c;一个用于统一图像生成的扩散模型。 >> 背景痛点&#xff1a;目前的图像生成模型大多专注于特定任务&#xff0c;例如文本到图像生成。…

数据分析python小工具录入产品信息到Excel

在没有后台管理系统的时候&#xff0c;有时候为了方便起见&#xff0c;想提供一个输入框让运营人员直接输入&#xff0c;然后数据就会以数据库的形式存进数据库 效果图&#xff1a; 输入用户名 输入数据 输入信息后点击添加到表格&#xff0c;检查后方便批量保存到excel …