数电与Verilog基础知识之always关键词及其相关

Verilog语言中三种固定的always关键词,它们分别是always_ff、always_latch和always_comb。它们都是用来描述电路元件的行为的,但是它们有不同的用途和限制。它们的工作原理如下:

  • always_ff是用来描述触发器的行为的,它只能包含时钟信号和复位信号的边沿触发事件,不能包含其他类型的事件。它只能使用非阻塞赋值(<=)来赋值输出信号,不能使用阻塞赋值(=)。它不能被其他进程写入相同的变量,也就是说输出信号只能由一个always_ff语句控制。
  • always_latch是用来描述锁存器的行为的,它可以包含任何类型的事件,但是必须有一个完整的if-else语句来控制输出信号。它只能使用阻塞赋值(=)来赋值输出信号,不能使用非阻塞赋值(<=)。它不能被其他进程写入相同的变量,也就是说输出信号只能由一个always_latch语句控制。
  • always_comb是用来描述组合逻辑电路的行为的,它不需要指定敏感列表,也就是说不需要列出触发语句块执行的事件,因为它会自动推断出所有相关的输入信号,并在任何一个输入信号发生变化时重新执行语句块。它只能使用阻塞赋值(=)来赋值输出信号,不能使用非阻塞赋值(<=)。它不能被其他进程写入相同的变量,也就是说输出信号只能由一个always_comb语句控制。

详细介绍如下:

always_comb

用来描述组合逻辑电路的行为。组合逻辑电路是一种没有存储元件的电路,它的输出信号只取决于当前的输入信号。always_comb语句的特点是:

  • 它不需要指定敏感列表,也就是说不需要列出触发语句块执行的事件,因为它会自动推断出所有相关的输入信号,并在任何一个输入信号发生变化时重新执行语句块。
  • 它会在仿真开始时自动执行一次,也就是说在时间0时,它会根据初始的输入信号计算出输出信号的值。
  • 它只能包含组合逻辑元件,也就是说不能包含触发器、锁存器、延时、事件控制或分支等时序逻辑元件。
  • 它只能使用阻塞赋值(=)来赋值输出信号,不能使用非阻塞赋值(<=)。
  • 它不能被其他进程写入相同的变量,也就是说输出信号只能由一个always_comb语句控制。

举个例子,假设有一个四位的全加器电路,它有两个四位的输入信号a和b,一个一位的进位输入信号cin,一个四位的输出信号s和一个一位的进位输出信号cout。可以用以下SystemVerilog代码来描述:

module adder(input logic [3:0] a, input logic [3:0] b, input logic cin, output logic [3:0] s, output logic cout);always_comb begin{cout, s} = a + b + cin; // 阻塞赋值·end
endmodule

上述代码第三行表示一个阻塞赋值,也就是说把右边的表达式的值赋给左边的变量,并且立即生效。左边的变量是一个连接符号{},它表示把两个或多个变量连接成一个变量。例如,{cout, s}表示一个五位的变量,它由cout和s两个变量组成,cout是最高位,s是低四位。右边的表达式是一个加法运算符+,它表示把两个或多个变量按位相加,并返回一个相同长度的结果。例如,a + b + cin表示把a、b和cin三个变量按位相加,并返回一个五位的结果。所以,这个语句的意思是把a、b和cin三个变量按位相加,并把结果的最高位赋给cout,低四位赋给s。

always_ff

用来描述触发器的行为。触发器是一种可以存储数据的电路元件,它有两个端口:时钟端口clk和数据端口d。触发器的输出端口q的值会在每个时钟信号的有效沿(通常是上升沿)时更新为数据端口d的值。always_ff语句的工作流程如下:

  • 首先,需要在always_ff语句后面用括号指定敏感列表,也就是触发语句块执行的事件。敏感列表只能包含时钟信号和复位信号的边沿触发事件,不能包含其他类型的事件。例如,@(posedge clk)表示只有在时钟信号clk的上升沿时才会执行语句块;@(posedge clk or negedge rst_n)表示只有在时钟信号clk的上升沿或复位信号rst_n的下降沿时才会执行语句块。
  • 然后,需要用begin和end包围一个语句块,也就是描述触发器功能的一组语句。语句块中只能使用非阻塞赋值(<=)来赋值输出信号,不能使用阻塞赋值(=)。非阻塞赋值表示赋值操作会在一个时间单位后才生效,并且不会影响其他赋值操作执行。例如,q <= d表示把数据信号d的值赋给输出信号q,并且延时一个时间单位。
  • 最后,需要注意不要被其他进程写入相同的变量,也就是说输出信号只能由一个always_ff语句控制。如果有多个always_ff语句控制同一个变量,那么可能会产生冲突或不确定的结果。

举个例子,假设有一个四位的D触发器电路,它有一个时钟输入端口clk,一个数据输入端口d,一个数据输出端口q,和一个异步复位输入端口rst_n。可以用以下SystemVerilog代码来描述:

module flop(input logic clk, input logic rst_n, input logic [3:0] d, output logic [3:0] q);always_ff @(posedge clk or negedge rst_n) beginif (rst_n == 0) q <= 4'b0; // 异步清零else q <= d; // 同步更新end
endmodule

always_latch

它用来描述锁存器的行为。锁存器是一种可以存储数据的电路元件,它有两个端口:使能端口en和数据端口d。锁存器的输出端口q的值会在使能端口en为高电平时更新为数据端口d的值,否则保持原来的状态。always_latch语句的工作流程如下:

  • 首先,需要在always_latch语句后面用括号指定敏感列表,也就是触发语句块执行的事件。敏感列表可以包含任何类型的事件,例如时钟信号的上升沿或下降沿,或者输入信号的变化。
  • 然后,需要用begin和end包围一个语句块,也就是描述锁存器功能的一组语句。语句块中必须有一个完整的if-else语句来控制输出信号,也就是说必须覆盖所有可能的输入情况。否则,如果有一些输入情况没有被处理,那么就会产生一个隐含的锁存器,这可能会导致错误或不确定的结果。
  • 最后,需要注意不要被其他进程写入相同的变量,也就是说输出信号只能由一个always_latch语句控制。如果有多个always_latch语句控制同一个变量,那么可能会产生冲突或不确定的结果。

举个例子,假设有一个四位的D锁存器电路,它有一个使能输入端口en,一个数据输入端口d,和一个数据输出端口q。可以用以下SystemVerilog代码来描述:

module latch(input logic en, input logic [3:0] d, output logic [3:0] q);always_latch @(en or d) beginif (en == 1) q = d; // 使能更新else q = q; // 保持状态end
endmodule

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

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

相关文章

所有集群启动的命令

所有集群启动的命令 查询所有节点启动Hadoop集群(Yarn模式)关闭Hadoop集群Spark&#xff08;local模式&#xff09;启动Spark集群standalone模式(不用了)关闭standalone模式HA下的standalone模式关闭HA-standalone模式Yarn模式&#xff08;重点&#xff09; 关闭Spark集群启动f…

python_day16_设计模式

“”“单例模式”“” “”“工厂模式”“” class Person:passclass Worker(Person):passclass Student(Person):passclass Teacher(Person):passclass Factory:def get_person(self, p_type):if p_type w:return Worker()elif p_type s:return Student()else:return Te…

代码随想录算法训练营第四十六天| 139.单词拆分 背包问题总结

代码随想录算法训练营第四十六天| 139.单词拆分 背包问题总结 一、力扣139.单词拆分 题目链接&#xff1a; 思路&#xff1a;确定dp数组&#xff0c;dp[i]为true表示从0到i切分的字串都在字典中出现过。 确定递推公式&#xff0c;dp[i] 为true要求 s[j, i] 在字典中出现&…

【雕爷学编程】MicroPython动手做(25)——语音合成与语音识别2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

排序(合集)

题目描述 将读入的 N 个数从小到大排序后输出。 输入格式 第一行为一个正整数 N。 第二行包含 N 个空格隔开的正整数 ai​&#xff0c;为你需要进行排序的数。 输出格式 将给定的 N 个数从小到大输出&#xff0c;数之间空格隔开&#xff0c;行末换行且无空格。 输入输出…

偶数科技与白鲸开源完成兼容性认证

近日&#xff0c;偶数科技自主研发的云原生分布式数据库 OushuDB v5.0 完成了与白鲸开源集成调度工具 WhaleStudio v2.0 的兼容性相互认证测试。 测试结果显示&#xff0c;双方产品相互良好兼容&#xff0c;稳定运行、安全&#xff0c;同时可以满足性能需求&#xff0c;为企业级…

Android 自定义按钮(可滑动、点击)

按钮图片素材 https://download.csdn.net/download/Lan_Se_Tian_Ma/88151085 px 和 dp 转换工具类&#xff08;Java&#xff09; // px 和 dp 转换工具类 public class DensityUtil {/*** 根据手机的分辨率从 dip 的单位 转成为 px(像素)*/public static int dip2px(Conte…

浅谈webpack

文章目录 Webpackwebpack的工作原理webpack的构建流程Webpack的基本功能有哪些Webpack常用配置 Webpack Webpack是一个现代的JavaScript应用程序静态模块打包工具。它是一个用于构建和打包前端资源的工具&#xff0c;可以将多个模块和资源&#xff08;如JavaScript、CSS、图片…

【C++】基于多设计模式下的同步异步日志系统

✍作者&#xff1a;阿润021 &#x1f4d6;专栏&#xff1a;C 文章目录 一、项目介绍二、项目实现准备工作1.日志系统技术实现策略2.相关技术知识补充2.1 不定参函数设计2.2 设计模式 三、日志项目框架设计1.模块划分2.各模块关系图 四、详细代码实现1.实用工具类设计2.日志等级…

java -jar指定外部配置文件

场景 spingboot项目部署jar时,需要时常修改配置,为了方便,将配置文件放到jar包外 操作步骤 在jar包同级目录下创建config文件夹(位置没有强制要求,为了方便而已) 在jar包同级目录下创建start.bat文件,并编辑内容 echo off :: 命令窗口标题 title yudibei_performance_tes…

第5章 最佳实践

过去的错误 不要怪罪JavaScript 游览器遇到不合法的html会想尽办法将他展现出来游览器遇到不合法的js将拒绝执行它们并报错写js要保障自己代码的健壮性 质疑一切 写js功能前一定要考虑这个功能的合理性&#xff0c;避免造成不可预见的后果写js功能前一定要考虑用户的游览器…

【Golang】基于录制,自动生成go test接口自动化用例

目录 背景 框架 ginkgo初始化 抓包&运行脚本 目录说明 ∮./business ∮./conf ∮./utils ∮./testcase testcase 用例目录结构规则 示例 实现思路 解析Har数据 定义结构体 解析到json 转换请求数据 转换请求 转换请求参数 写业务请求数据 写gotest测试…

【element-plus】 table表格每行圆角解决方案 element也通用

系列文章目录 【Vue3ViteTselement-plus】使用tsx实现左侧栏菜单无限层级封装 前言 我们在使用element-plus或element 的table时是否有时UI给到的UI效果是如下面这样的&#xff0c;但是我们翻遍了组件库的文档 调整了很多次样式 发现在 左右侧栏固定的时候 普通的方法是完全…

装修小程序,开启装修公司智能化服务的新时代

随着数字化时代的来临&#xff0c;装修小程序成为提升服务质量和效率的关键工具。装修小程序旨在为装修公司提供数字化赋能、提高客户满意度的智慧装修平台。通过装修小程序&#xff0c;装修公司能够与客户进行在线沟通、展示设计方案、提高服务满意度等操作。 装修小程序的好处…

手机pdf转换成word免费版?看看这几个转换方法

手机pdf转换成word免费版&#xff1f;在当今信息化的时代&#xff0c;PDF文档已经成为公文交流、资料分享、学术论文等领域中最常用的文件格式之一。然而&#xff0c;PDF文档的固化特性也使其在文本编辑、内容修改等方面存在不便。因此&#xff0c;将PDF文档转换为Word文档已成…

hive函数大全

在hive内部有许多函数&#xff0c;如下&#xff1a; 内置运算符 关系运算符 算术运算符 逻辑运算符 复杂类型函数 内置函数内置聚合函数 数学函数 收集函数 类型转换函数 日期函数 条件函数 字符函数 内置聚合函数 内置表生成函数 1.1关系运算符 等值比较: 等值比较:<>…

js中什么是宏任务、微任务?宏任务、微任务有哪些?又是怎么执行的?

目录 目录 目录 参考资料 必看强烈建议十分钟看完视频 &#xff0c;即可学会 必看参考详解宏任务微任务 参考资料 1 宏任务与微任务_哔哩哔哩_bilibili 什么是宏任务、微任务&#xff1f;宏任务、微任务有哪些&#xff1f;又是怎么执行的&#xff1f;_什么是宏任务和微任…

简单的知识图谱可视化+绘制nx.Graph()时报错TypeError: ‘_AxesStack‘ object is not callable

绘制nx.Graph时报错TypeError: _AxesStack object is not callable 写在最前面知识图谱可视化预期报错可能的原因 原代码原因确认解决后的代码解决&#xff01; 写在最前面 实现一个简单的知识图谱的可视化功能。 使用了NetworkX库来构建知识图谱&#xff0c;并使用matplotlib…

基于Java的房屋租赁系统设计与实现(源码+lun文+数据库)

对于需要租房的人&#xff0c;有的可能没有时间去街上广告处查看房屋信息&#xff1b;对于房屋出租者来说&#xff0c;大量复杂的房产信息、租金等信息很难通过传统的方式进行管理。以方便租客租房&#xff0c;房东求租、求售的需求为向导&#xff0c;开发一套基于web的房屋管理…

打印时钟在终端上,输入quit,结束时钟

一、书写守护进程 步骤&#xff1a; 创建一个孤儿进程创建一个新的会话组修改运行目录到不可卸载的文件系统重设文件权限掩码关闭所有文件描述符 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int main(i…