Verilog 语法 (二)

        在掌握了 Verilog 的基础语法和常用程序框架之后,本节将带大家深入学习一些 高级设计知识点。这些内容包括:

阻塞赋值(=)与非阻塞赋值(<=)的区别及使用场景;

assignalways 语句的差异;

什么是锁存器(Latch),以及如何避免不必要的锁存器;

有限状态机(FSM)的基本结构与应用;

模块化设计思想及其实践方法。

阻塞赋值
阻塞赋值,顾名思义即在一个 always 块中,后面的语句会受到前语句的影响,具体来说就是在同一个 always 中,一条阻塞赋值语句如果没有执行结束,那么该语句后面的语句就不能被执行,即被 阻塞 。也就是说 always 块内的语句是一种顺序关系,这里和 C 语言很类似。符号“ = ”用于阻塞的赋值(如 :b = a;),阻塞赋值“ = ”在 begin end 之间的语句是顺序执行,属于串行语句。
RHS :赋值等号右边的表达式或变量可以写作 RHS 表达式或 RHS 变量;
LHS :赋值等号左边的表达式或变量可以写作 LHS 表达式或 LHS 变量;
阻塞赋值的执行可以认为是只有一个步骤的操作,即计算 RHS 的值并更新 LHS ,此时不允许任何其他语句的干扰,所谓的阻塞的概念就是值在同一个 always 块中,其后面的赋值语句从概念上来讲是在前面一条语句赋值完成后才执行的。

 

posedge clk:时钟上升沿触发;

negedge rst_n:低电平复位触发(rst_n 是低有效复位信号);

这表示在复位时,三个变量分别被赋初值。

a = 0;
b = a;
c = b;

这三行是阻塞赋值,意味着它们是顺序执行的不是并行的

b = a; 举例,由于 a = 0; 已经执行完了,b 实际上赋的值就是 0。

同理,c = b; 也赋的是更新后的 b,也是 0。

最终 a = 0, b = 0, c = 0

如果我们改用非阻塞赋值(<=):

a <= 0;
b <= a;
c <= b;

这样所有赋值将在时钟沿结束后同时生效,即:

a <= 0;

b <= 原来的 a 值

c <= 原来的 b 值

这就实现了寄存器的移位操作(流水线结构),是我们设计中经常想要的行为。

特性阻塞赋值 (=)非阻塞赋值 (<=)
执行方式按顺序执行(立即更新)并行执行(统一在时钟边沿更新)
用于一般用于组合逻辑推荐用于时序逻辑(寄存器)
本例中问题变量值被覆盖,行为不符合预期可实现流水线等预期行为
非阻塞赋值
符号“ <= ”用于非阻塞赋值(如 :b <= a; ),非阻塞赋值是由时钟节拍决定,在时钟上升到来时,执行赋值语句右边,然后将 begin-end 之间的所有赋值语句同时赋值到赋值语句的左边,注意:是 begin—end之间的所有语句,一起执行,且一个时钟只执行一次,属于并行执行语句。这个是和 C 语言最大的一个差异点,大家要逐步理解并行执行的概念。
非阻塞赋值的操作过程可以看作两个步骤:
1 )赋值开始的时候,计算 RHS
2 )赋值结束的时候,更新 LHS

 

这部分内容是非阻塞的内容,在此阻塞的内容也介绍了。

ok完毕~,接下来就是assign always 区别了。

assign always 区别

在 Verilog 中,assignalways 是两种描述逻辑行为的基本语句。两者既有相似性也有明显的区别,特别是在时序逻辑和组合逻辑的描述中用途不同。

assign 语句

用法: 用于连续赋值(continuous assignment)。

只能用于组合逻辑

不能包含时钟

语句写法非常简洁,适用于简单的逻辑关系。

always @(*) begincase (led_ctrl_cnt)2'd0 : led = 4'b0001;2'd1 : led = 4'b0010;2'd2 : led = 4'b0100;2'd3 : led = 4'b1000;default : led = 4'b0000;endcase
end
项目assignalways @(*)
用于描述连续赋值的组合逻辑过程赋值的组合逻辑或更复杂的逻辑
是否必须赋值所有输出是(自动)是(手动,否则会生成锁存器)
写法单行表达式(简洁)可多行,逻辑复杂时更清晰
可读性简洁,逻辑简单时最直观更灵活,适合多判断、多分支等场景
是否需要 default 分支不需要建议加上,否则可能综合成锁存器
是否可用于时序逻辑❌ 否(不含时钟,不能生成寄存器)✅ 可用于时序逻辑(带 clk)

 

latch 是指锁存器,是一种对脉冲电平敏感的存储单元电路。锁存器和寄存器都是基本存储单元,锁存器是电平触发的存储器,寄存器是边沿触发的存储器。两者的基本功能是一样的,都可以存储数据。锁器是组合逻辑产生的,而寄存器是在时序电路中使用,由时钟触发产生的。
latch 的主要危害是会产生毛刺( glitch ),这种毛刺对下一级电路是很危险的。并且其隐蔽性很强,不易查出。因此,在设计中,应尽量避免 latch 的使用。
代码里面出现 latch 的两个原因是在组合逻辑中, if 或者 case 语句不完整的描述,比如 if 缺少 else 分支,case 缺少 default 分支,导致代码在综合过程中出现了 latch 。解决办法就是 if 必须带 else 分支, case 必须带 default 分支。
大家需要注意下,只有不带时钟的 always 语句 if 或者 case 语句不完整才会产生 latch ,带时钟的语句 if 或者 case 语句不完整描述不会产生 latch
下面为缺少 else 分支的带时钟的 always 语句和不带时钟的 always 语句,通过实际产生的电路图可以看到第二个是有一个 latch 的,第一个仍然是普通的带有时钟的寄存器。
项目锁存器(Latch)寄存器(Register)
触发方式电平触发(高电平或低电平)边沿触发(posedge 或 negedge)
属于哪种逻辑组合逻辑推导而来时序逻辑
是否带时钟信号❌ 不依赖时钟✅ 依赖时钟
容易产生的问题⚠️ 容易引入毛刺竞争冒险✅ 稳定,常规使用
综合方式always @(*) 中未完整赋值会生成使用 always @(posedge clk) 等生成

 

latch 是组合逻辑中赋值不完整的副产品,既不安全也不推荐,应靠良好编码习惯避免。

状态机

Verilog 是用于描述并行硬件电路的语言,但在某些功能中,我们想按“步骤”来完成逻辑,比如:

串口收发数据(开始 → 收 → 校验 → 存储)

SDRAM 控制(初始化 → 激活 → 读写 → 刷新)

协议处理器(等待命令 → 解码 → 执行)

这时候,大量的 if/else 嵌套 不仅难写,而且容易出错。状态机(FSM)能把这些步骤清晰地“拆分成状态”,通过时钟驱动状态跳转来控制整个流程,逻辑结构清晰、易于维护。

状态机的分类:Mealy vs Moore

类型状态转移是否依赖输入输出是否依赖输入特点
Moore✅ 是❌ 否输出只依赖状态,更稳定、更容易综合
Mealy✅ 是✅ 是输出响应更快,但逻辑更复杂

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

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

相关文章

OpenCV 图形API(61)图像特征检测------检测图像边缘的函数Canny()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用Canny算法在图像中查找边缘。 该函数在输入图像中查找边缘&#xff0c;并使用Canny算法在输出映射&#xff08;edges&#xff09;中标记它们…

ubantu中下载编译安装qt5.15.3

操作步骤如下&#xff1a; 克隆 Qt 仓库&#xff1a; git clone https://code.qt.io/qt/qt5.git cd qt5 切换到 Qt 5.15.3 标签&#xff1a; git checkout v5.15.3-lts-lgpl 初始化子模块&#xff1a; perl init-repository 配置和编译 Qt&#xff1a; ./configure -prefix $H…

毕业论文设计基本内容和要求:

毕业设计基本内容和要求&#xff1a; 研究内容 调查了解LAMP架构和PHP开发&#xff1b; 学习百度旅游调用的其他产品线服务并熟悉请求接口&#xff1b; 学习社区业务层规范&#xff1b; 设计并实现旅游主要模块&#xff1b; 技术指标 熟悉企业中流程运转的方式&#xff0c;…

【大语言模型】大语言模型(LLMs)在工业缺陷检测领域的应用

大语言模型&#xff08;LLMs&#xff09;在工业缺陷检测领域的应用场景正在快速扩展&#xff0c;结合其多模态理解、文本生成和逻辑推理能力&#xff0c;为传统检测方法提供了新的技术路径。以下是该领域的主要应用场景及相关技术进展&#xff1a; 1. 多模态缺陷检测与解释 视…

【AI插件开发】Notepad++ AI插件开发1.0发布和使用说明

一、产品简介 AiCoder是一款为Notepad设计的轻量级AI辅助插件&#xff0c;提供以下核心功能&#xff1a; 嵌入式提问&#xff1a;对选中的文本内容进行AI分析&#xff0c;通过侧边栏聊天界面与AI交互&#xff0c;实现多轮对话、问题解答或代码生成。对话式提问&#xff1a;独…

第2讲:R语言中的色彩美学——科研图表配色指南

目录 一、背景导引:科研图表为何需要“配色讲究”? 二、色彩基础认知:别让“红绿盲”错过你的科研成果 三、R语言中的配色库全景图 四、案例演示与代码实战 🎨案例1:ggplot2 + viridis 配色的热图 🎨案例2:MetBrewer 中的印象派色彩 五、技巧点拨:如何为SCI图…

基于Django的个性化股票交易管理系统

本项目基于Python3.6、Django2.1、MySql8.0&#xff08;最好不要使用5.6&#xff0c;字符集等方面均不兼容&#xff0c;否则导入数据库会出错&#xff09;与股票信息工具包TuShare实现。 创建或激活对应Python开发环境 这里使用了conda来管理环境&#xff0c;强烈推荐&#xf…

超越GPT-4?下一代大模型的技术突破与挑战

超越GPT-4&#xff1f;下一代大模型的技术突破与挑战 引言&#xff1a;大模型的演进历程 人工智能领域近年来最引人注目的发展莫过于大型语言模型(Large Language Models, LLMs)的快速进步。从GPT-3到GPT-4&#xff0c;再到如今各种宣称"超越GPT-4"的模型不断涌现&…

Js 之点击下拉搜索Ajax-Bootstrap-Select

一、效果图 二、文档 https://gitcode.com/gh_mirrors/aj/Ajax-Bootstrap-Select/tree/master 三、示例代码 引入插件js、css <link rel"stylesheet" href"{php echo MODULE_URL}template/lib/bootstrap-select/css/bootstrap-select.min.css"> <…

无线监控系统分类全解析:搭配视频融合平台EasyCVR开启高效监控

随着技术的发展&#xff0c;无线监控系统在家庭、小型企业、特定行业以及室外恶劣环境中的应用越来越广泛。本文将介绍几种常见的无线监控系统&#xff0c;分析其优缺点&#xff0c;并结合EasyCVR视频融合平台的功能&#xff0c;探讨如何优化无线监控系统的性能和应用。 一、主…

WebRTC服务器Coturn服务器中的通信协议

1、概述 作为WebRTC服务器&#xff0c;coturn通信协议主要是STUN和TURN协议 STUN&TURN协议头部都是20个字节,用 Message Type来区分不同的协议 |------2------|------2------|------------4------------|------------------------12-------------------------|-----------…

Vue Transition 组件详解:让元素动起来

文章目录 一、为什么需要 Transition 组件&#xff1f;二、核心工作原理三、基础用法&#xff1a;6个过渡类名四、进阶用法五、 JavaScript 钩子函数六、过渡模式&#xff08;Mode&#xff09;七、列表过渡&#xff08;TransitionGroup&#xff09;八、与第三方动画库结合&…

【Redis】有序集合类型Sortedset 常用命令详解

此类型和 set 一样也是 string 类型元素的集合&#xff0c;且不允许重复的元素 不同的是每个元素都会关联一个double类型的分数&#xff0c;redis正是通过分数来为集合中的成员进行从小到大的排序 有序集合的成员是唯一&#xff0c;但分数(score)却可以重复 1. zadd - 添加 语法…

微信小程序 van-dropdown-menu

点击其他按钮&#xff0c;关闭van-dropdown-menu下拉框 DropdownMenu 引入页面使用index.wxmlindex.scssindex.ts(重点)index.ts(全部) DropdownMenu 引入 在app.json或index.json中引入组件 "usingComponents": {"van-dropdown-menu": "vant/weapp…

C 语言内存分配方法及优缺点

在 C 语言开发中&#xff0c;内存分配的方式主要有三种&#xff1a;静态内存分配、栈内存分配和堆内存分配。每种分配方式都有其独特的特点、适用场景以及优缺点。 静态内存分配 静态内存分配是在编译时就确定好内存的分配&#xff0c;它主要用于定义全局变量和静态局部变量。…

第二大脑-个人知识库

原文链接:https://i68.ltd/notes/posts/20250407-llm-person-kb/ Quivr-第二大脑一样的个人助手&#xff0c;利用AI技术增强个人生产力 将 GenAI 集成到您的应用程序中的个性化 RAG,专注于您的产品而非 RAG项目仓库:https://github.com/QuivrHQ/quivr Star:37.7k官网:https:/…

A. Ambitious Kid

time limit per test 1 second memory limit per test 256 megabytes Chaneka, Pak Chaneks child, is an ambitious kid, so Pak Chanek gives her the following problem to test her ambition. Given an array of integers [A1,A2,A3,…,AN][A1,A2,A3,…,AN]. In one o…

SQL进阶知识:八、性能调优

今天介绍下关于性能调优的详细介绍&#xff0c;并结合MySQL数据库提供实际例子。 性能调优是数据库管理中的一个重要环节&#xff0c;尤其是在处理高并发和大数据量的应用场景时。MySQL提供了多种工具和方法来优化数据库性能。以下是关于MySQL性能调优的详细介绍&#xff0c;以…

NVLink、UALink 崛起,PCIe Gen6 如何用 PAM4 迎战未来?

现在数字经济发展地相当快速&#xff0c;像Cloud、现在火红的AI、大数据这些新技术都需要在数据中心里运行更多运算&#xff0c;伴随而来的是更快的数据传输速度的需求。 在数据中心&#xff0c;有很多条数据传输路径&#xff0c;举例 &#xff1a; Server 和Storage之间&…

Jenkins流水线管理工具

文章目录 前言&#xff1a; DevOps时代的自动化核心 —Jenkins一、Jenkins是什么&#xff1f;二、Linux安装Jenkinswar包方式安装依赖环境下载 Jenkins WAR 包启动 Jenkins 服务启动日志验证配置插件镜像源 docker镜像方式安装依赖环境拉取 Jenkins 镜像运行 Jenkins 容器获取初…