硬件语言 Verilog HDL 学习 day02 数据流建模,行为级建模,结构化建模

news2024/11/15 19:39:29

1.数据流建模

1.含义:在电路规校较小的清况下,由于包含的门数比较少,设计者可以逐个地引用逻辑门实例把它 们互相连接起来, 因此使用门级建换进行设计是很合适的。对于具有数字逻辑电路设计基本知识的用户来讲,门级建模是非常直观的。然而.如果电路的功能比较复杂.其中包含的逻辑门的个数会很多这时使用门级设计不但很繁琐并且很容易出错在这种情况下,如果设计者能从更高的抽象层次入手,将设计重点放在功能的实现上,则不仅能够避免繁琐的细节、而且还可以大大提高设计的效率。因此, Verilog 支持用户从数据流的角度对电路建模。数据流建换意味若根据数据在寄存器之间的流动和处理过程对电路进行描述.而不是直接对电路的逻辑门进行实例引用。

2.逻辑综合:目前普遍采用的设计方法是借助于计算机辅助设计工具, 自动将电路的数据流设计直接转换为门级结构 , 这个过程也称为逻辑综合。

3.RTL:通常是指数据流建模和行为级建模的结合
 

4.连续赋值语句:用来对线网进行赋值,它从更高的抽象角度来对电路进行描述,赋值语句以assign开始。可以加上驱动强度、延时。

重点:连续赋值语句的左值必须是一个标量或向量线网,或者是标量或向量线网的拼接,而不能是向量或向量寄存器。

显性连续赋值  举例:  (已经声明的这个 标识符的状态再进行赋值)(有 assign 标号)

//连续赋值语句, out 是线网, i1 和 i2 也是线网
wire out,i1,i2;
    begin
        assign out =i1 & i2 
    end


// 向量线网的连续赋值语句,addr是16位的向量线网
// addr1 和 addr2 是 16位的向量寄存器
reg[15:0]addr1,addr2;
    begin
        assign addr[15:0] = addr1 | addr2;
    end


//拼接操作  , 赋值操作符左侧是标量线网和向量网的拼接
assign {cout,sum[3:0]} =a[3:0] + b[3:0] + cin

隐性连续赋值说明   (边声明边赋值,有没有写 assign)

//普通的连续赋值
    begin
        wire out;
        assign out = in1 & in2
    end

//使用隐式连续赋值实现与上面两条同样的功能
wrie out = in1 & in2


//连续赋值  out 为线网类型
wire i1, i2;
assign out = i1 & i2;
 

参考文章:Verilog 数据流建模_verilog数据流建模_George_ray的博客-CSDN博客


2.行为级建模

1.initial 过程语句 :其中initial常用于仿真中的初始化,其中的语句只执行一次。代表一个独立的执行过程。  (整个过程只运行一次)

参考文章链接:  (文章写的太好了,直接去看他的吧!!!)FPGA学习笔记(三)——Verilog HDL基本语句_verilog里wait_DID 迪的博客-CSDN博客


2.always 过程语句 :一个模块中可有多个always语句;每个always语句只要有相应的触发事件产生,对应的语句就执行;与各个always语句书写的前后顺序无关,它们之间是并行运行的。

参考文章链接:  (文章写的太好了,直接去看他的吧!!!)FPGA学习笔记(三)——Verilog HDL基本语句_verilog里wait_DID 迪的博客-CSDN博客


3.begin  -end 串行语句块

含义:在这个语句里面的 命令是顺序执行的,只有当前命令只有在它的上一条命令结束后才会执行。 (推荐使用 堵塞赋值,效果最后)

参考文章链接:  (文章写的太好了,直接去看他的吧!!!)

FPGA学习笔记(三)——Verilog HDL基本语句_verilog里wait_DID 迪的博客-CSDN博客


4.fork join 并行语句

含义: 在这个语句里面的命令,是并行执行的, 都是在 等式右边的值计算完成后,同时赋值给对应等式 左边的标识符, 所以说我们的并行语句是不受  中间两个命令的值的变化而变化的。(就是并行命令之间没有联系!!

参考文章链接:  (文章写的太好了,直接去看他的吧!!!)FPGA学习笔记(三)——Verilog HDL基本语句_verilog里wait_DID 迪的博客-CSDN博客


5.assign 过程连续赋值

含义:连续过程赋值,等于当你写了这个语句,当这个等式右边的值有变化,等式左边的值也会有变化。

参考文章:  (可以详细的知道 assign 的用法)(1条消息) Verilog初级教程(8)Verilog中的assign语句_verilog assign_李锐博恩的博客-CSDN博客


6. 过程赋值 =  (堵塞赋值语句) <=(不堵塞赋值语句)

掌握可综合风格的Verilog模块编程的8个原则:

      (1)  时序电路建模时,用非阻塞赋值。

  (2)  锁存器电路建模时,用非阻塞赋值。

  (3)  用always块建立组合逻辑模型时,用阻塞赋值。

  (4)  在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。

  (5)  在同一个always块中不要既用非阻塞赋值又用阻塞赋值。

  (6)  不要在一个以上的always块中为同一个变量赋值。

  (7)  用$strobe系统任务来显示用非阻塞赋值的变量值。

  (8)  在赋值时不要使用 #0延时。

阻塞赋值(=):

  我们先做下面定义:RHS—赋值等号右边的表达式,LHS—赋值等号左边的表达式。在串行语句块中,阻塞赋值语句按照它们在块中的排列顺序依次执行,即前一条语句没有完成赋值之前,后面的语句不可能被执行,换言之,后面的语句被阻塞了。阻塞赋值的执行可以认为只有一个步骤的操作,即计算RHS并更新LHS,此时不允许有来自任何其他Verilog语句的干扰。所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上是在前一条赋值语句结束后开始赋值的。有句话我一直没读懂:从理论上讲,它与后面的赋值语句只有概念上的先后,而无实质上的延时。

非阻塞赋值(<=):

  非阻塞语句的执行过程是:首先计算语句块内部所有右边表达式(RHS)的值,然后完成对左边寄存器变量的赋值操作,例如,下面两条非阻塞赋值语句的执行过程是:先计算右边表达式的值并暂存在一个暂存器中,A的值被保存在一个寄存器中,而B+1的值被保存在另一个寄存器中,在begin和end之间所有语句的右边表达式都被计算并存储完后,对左边的寄存器变量的赋值才会进行。这样C得到的是B的原始值而不是A加一。

参考文章: 阻塞(=)和非阻塞赋值(<=)的不同——《Verilog数字系统设计教程》读书笔记(一) - zxl2431 - 博客园 (cnblogs.com)



7. 条件语句  if -else   case casez   (if -else可以嵌套)  (超过四个使用 case)

casez  全等比较  (z  高阻态为1)   casex   全等比较(x  未知态为1)

一,使用case语句需要注意的是:
(1)值1到值n之间必须各不相同,一旦判断到与某值相同并执行相应语句块后,case语句的执行便结束。
(2)如果某几个连续排列的值项执行的是同一条语句,则这几个值项间可用逗号相隔,而将语句放在这几个值项的最后一个中。
(3) default选项相当于if-else语句中的else部分,可依据需要用或者不用,当前面已经列出了敏感表达式的所有可能值,则default可以省略。

(4)case语句的所有表达式的值的位宽必须相等,只有这样控制表达式和分支表达式才能进行对应位的比较。

case语句是一种多分支选择语句,if语句只有两个分支可供选择,而实际问题中常常需要用到多分支选择,Verilog语言提供的case语句直接处理多分支选择。case语句通常用于微处理器的指令译码,

它的一般形式如下:

1) case(表达式) <case分支项> endcase

2) casez(表达式) <case分支项> endcase

3) casex(表达式) <case分支项> endcase

case分支项的一般格式如下:

分支表达式: 语句
缺省项(default项): 语句

说明:

a) case括弧内的表达式称为控制表达式,case分支项中的表达式称为分支表达式。控制表达式通常表示为控制信号的某些位,分支表达式则用这些控制信号的具体状态值来表示,因此分支表达式又可以称为常量表达式。

b) 当控制表达式的值与分支表达式的值相等时,就执行分支表达式后面的语句。如果所有的分支表达式的值都没有与控制表达式的值相匹配的,就执行default后面的语句。

c) default项可有可无,一个case语句里只准有一个default项。(具体而言,尽量要有一个default,可以是一个空语句。当然语法上,没有default也不会报错。)

参考文章:【 Verilog HDL 】case, casez, casex 之干货总结_51CTO博客_verilog case和casex

 可以看看这个文章,讲的很好。


8.循环语句  forever  repeat  for    while   (初学阶段,所以借鉴才是正道)

一个链接:

(1条消息) Verilog 循环语句(while, for, repeat, forever)_verilog forever_一只迷茫的小狗的博客-CSDN博客


9.强制语句和释放语句  force release

链接:

verilog语法之force和release - ruoshuihjjj - 博客园 (cnblogs.com)



3.结构化建模

(1)模块级建模:通过调用由用户设计生成的低级子模块来对硬件电路结构进行说明,这种情况下模块由低级模块的实例组成。
(2)门级建模:通过调用Verilog HDL内部的基本门级元件来对硬件电路的结构进行说明,这种情况下模块将由基本门级元件的实例组成。
(3)开关级建模:通过调用Verilog HDL内部的基本开关元件来对硬件电路的结构进行说明,这种情况下模块将由基本开关级元件的实例组成。

学习知识点的 链接:(1条消息) Verilog学习笔记·Day6 结构化建模_verilog结构化建模_九族共瞻迟的博客-CSDN博客


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

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

相关文章

Java性能调优杀手锏JMH

JMH简介 JMH(Java Microbenchmark Harness)由 OpenJDK/Oracle 里面那群开发了 Java编译器的大牛们所开发&#xff0c;是一个功能强大、灵活的工具&#xff0c;它可以用于检测和评估Java应用程序的性能&#xff0c;主要目的是测量Java应用程序的性能&#xff0c;尤其是在多线程…

SpringBoot 中的 Aop + 自定义注解(内含源代码)

SpringBoot 中的 Aop 自定义注解&#xff08;内含源代码&#xff09; 源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87553544 目录SpringBoot 中的 Aop 自定义注解&#xff08;内含源代码&#xff09;源代码下载链接地址&#xff1a;…

Docker WIndows最新版(4.17.x)修改镜像存储路径

一般情况 在 Docker Desktop 4.17.0 版本中&#xff0c;可以按照以下步骤来修改 Docker 镜像存储路径 打开 Docker Desktop 应用程序&#xff0c;单击顶部菜单栏中的 Docker Desktop 菜单&#xff0c;然后选择 Resources&#xff08;资源&#xff09;选项卡。 在 Resources 选…

【微信小程序】-- 自定义组件 -- 创建与引用 样式(三十二)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

信创国产化替代势在必行,FTP有替代产品吗?

自2018年开始&#xff0c;由于国外对IT技术发展的限制&#xff0c;在“华为、中兴事件”催化下&#xff0c;我国信创进入快速推广期。信创的产业庞大&#xff0c;涉及基础硬件&#xff08;芯片、服务器等&#xff09;、基础软件&#xff08;操作系统、数据库、中间件等&#xf…

QT使用QListWidget显示多张图片

Qt系列文章目录 文章目录Qt系列文章目录前言一、QListWidget 和 QListView 的差异二、显示效果1.操作工作区界面1.主界面头文件2. 主界面实现界面2.左边图片目录展示界面1.图片目录头文件2.图片目录实现文件2.属性窗口区1.属性窗口头文件2.属性窗口实现文件3 源码下载前言 QLi…

【安卓软件】KMPlayer-一款完美的媒体播放器 可以播放所有格式的字幕和视频

KM PlayerKM Player是一款未编码的视频播放器&#xff0c;让您无需编码即可方便地播放各种格式的视频&#xff0c;并为您的新体验添加了字幕支持、视频播放速度和手势等功能。KMPlayer 拥有美观和直观的设计&#xff0c;让您可以更方便地管理和播放视频&#xff01;功能高品质视…

电流分段校准原理与步骤

分段电流校准是一种校准电流传感器的方法。 传感器不可避免地存在误差&#xff0c;这些误差可能来自于不同方面&#xff0c;例如温度漂移、零点漂移和灵敏度漂移等。 在精确测量电流的应用中&#xff0c;这些误差可能会导致测量结果不准确。 因此&#xff0c;对电流传感器进行校…

100种思维模型之认知资源思思维模型-030

我们常说&#xff0c;一个人永远也赚不到自己认知以外的钱&#xff0c;这话的确很有道理&#xff0c;被无数人所推崇。 由此&#xff0c;不难看出&#xff0c;认知在我们的生活起着多么关键的作用。 你的认知层次越高&#xff0c;范围越广&#xff0c;就意味着你这个人所处的阶…

vue - vue使用腾讯api进行定位获取,绘制地图、标点、搜索、路线规划

章节目录1&#xff0c;前言2&#xff0c;准备3&#xff0c;开始引入api4&#xff0c;vue组件中使用 - 获取定位5&#xff0c;绘制地图和标点6&#xff0c;关键字搜索功能7&#xff0c;驾车线路规划8&#xff0c;演示组件中的全部代码9&#xff0c;参考链接1&#xff0c;前言 首…

Vue项目本地开发集成引入https

问题描述 本地项目开发中用到的接口是https &#xff0c;本地http会请求不到数据 案例使用采用的vue-cli开发&#xff0c;所以需要针对这两种方式启动https 问题处理 1.首先是需要配置一个证书,使用mkcert 进行配置证书 2.在vue-cli 中进行修改package.json、vue.config.js 中进…

Leetcode.828 统计子串中的唯一字符

题目链接 Leetcode.828 统计子串中的唯一字符 Rating &#xff1a; 2034 题目描述 我们定义了一个函数 countUniqueChars(s)来统计字符串 s中的唯一字符&#xff0c;并返回唯一字符的个数。 例如&#xff1a;s "LEETCODE"&#xff0c;则其中 "L", "…

【Mysql】查询数据库,行转列,mapper.xml中查询条件的写法

目录 一、用mysql脚本建表二、现有以下三个实体对应三张表&#xff0c;其关联关系如下三、行转列的sql语句四、对应的mapper.xml写法五、输入某一关键字&#xff0c;查找车牌号或车名包含该关键字的车辆用or六、总结&#xff1a;用GROUP_CONCAT实现行转列一、用mysql脚本建表 …

compose系列教程-6.实现图文列表,添加点击事件

每个行添加点击事件&#xff0c;可以使用Clickable组件。在Clickable组件的onClick参数中&#xff0c;您可以指定要在用户单击行时执行的操作。下面是一个示例代码&#xff1a; Composable fun ImageTextList(imageTextList: List<ImageTextItem>, onItemClick: (ImageTe…

机器学习学习记录1:基本术语和假设空间

基本术语机器学习正是这样一门学科&#xff0c;它致力于研究如何通过计算的手段&#xff0c;利用经 验来玫善系统自身的性能在计算机系统中&#xff0c;"经验"通常以"数据"形式存 在&#xff0c;因此&#xff0c;机器学习所研究的主要内容&#xff0c;是关…

数据仓库的设计思想

数据仓库设计 知识点01&#xff1a;设计大纲与学习目标 #内容大纲1、数据仓库基础知识&#xff08;回顾&#xff09;什么是数仓为什么有数仓数仓的特点是什么OLTP和OLAP系统区别&#xff08;数据库和数仓的区别&#xff09;2、数仓系统的架构与核心流程核心1&#xff1a;ETL核…

mybatis(二)

mybatis练习---2种方式 能够使用映射配置文件实现CRUD操作 能够使用注解实现CRUD操作 配置文件CRUD就是把sql语句写到配置文件中&#xff0c;注解CRUD就是吧sql语句写到注解上。 一、配置文件实现CRUD 如上图所示产品原型&#xff0c;里面包含了品牌数据的 查询 、 按条件查…

使用ControlNet 控制 Stable Diffusion

本文将要介绍整合HuggingFace的diffusers 包和ControlNet调节生成文本到图像&#xff0c;可以更好地控制文本到图像的生成 ControlNet是一种通过添加额外条件来控制扩散模型的神经网络结构。它提供了一种增强稳定扩散的方法&#xff0c;在文本到图像生成过程中使用条件输入&…

【工具使用】STM32CubeMX-基础使用篇

一、概述 无论是新手还是大佬&#xff0c;基于STM32单片机的开发&#xff0c;使用STM32CubeMX都是可以极大提升开发效率的&#xff0c;并且其界面化的开发&#xff0c;也大大降低了新手对STM32单片机的开发门槛。     本文主要面向初次接触STM32CubeMX的同学&#xff0c;大…

垃圾回收:垃圾数据如何自动回收

有些数据被使用之后&#xff0c;可能就不再需要了&#xff0c;我们把这种数据称为垃圾数据。如果这些垃圾数据一直保存在内存中&#xff0c;那么内存会越用越多&#xff0c;所以我们需要对这些垃圾数据进行回收&#xff0c;以释放有限的内存空间 不同语言的垃圾回收策略 通常…