当前位置: 首页 > news >正文

Verilog HDL学习记录(3~4章)

3.Verilog HDL 程序设计语句和描述方式

3.1数据流建模

        连续赋值语句只能用来对连线型变量进行驱动,而不能对寄存器型变量进行赋值,连线型变量由assign引导,寄存器类型一般在initial或always语句块中;连续赋值语句不能出现在过程块中;多个连续赋值语句之间是并行关系,与位置顺序无关。

3.2行为级建模

        下图为VHDL行为描述中模块的构成框架。

        “可综合" 是指能够被电子设计自动化工 具(EDA 工具)转化为实际硬件电路的能力。

3.2.1 过程语句 

        过程块由过程语句组成,过程语句有两种,分别是:initial与always。在initial和always中赋值时,必须用reg型的寄存器变量。

        initial:

        initial在仿真过程中只执行一次,不用在工程设计文件中,都是从0时刻开始执行。initial过程块内的多条行为语句可以顺序执行,也可以并行执行。

        always:

        always过程语句触发状态一直存在,只要满足后面的敏感事件列表,就执行语句块。

        always@(<敏感事件列表>)

        敏感事件就是触发条件,当敏感事件列表中的值符合变化时,就会引发块内语句的执行。当有>=2个信号时,用or或,连接。一般触发类型为:posedge、negedge。

3.2.2 语句块

        当语句数超过一条时,需要采用语句块,语句块由标识符begin-end或fork-join引导。begin-end是串行方式顺序执行。fork-join是并行方式执行,只能用于仿真测试。

3.2.3 过程赋值语句

        过程块中的赋值语句叫过程赋值语句,是在initial或always语句内的赋值,只能对寄存器数据类型的变量赋值,对于多位宽的寄存器,还可以只对其中某一位或几位赋值。

        1.阻塞赋值语句

        变量=表达式;b=a;

        有多条阻塞语句时,要按照顺序执行,上面的执行完了,才能执行下面,不然就会堵在那里。先计算等号右边表达式的值,然后立即赋给左边。

        2.非阻塞赋值语句

        变量<=表达式;b<=a;

        在多条非阻塞赋值语句下,都是并行执行,前面的语句不会影响后面语句的执行。

        触发器就是在每个时钟沿来临时,让当前状态值更改为当前D的值,Q^n+1=D ,可以存储值。

3.2.4 过程连续赋值语句

        连续赋值assign可以在过程块中对连线型和寄存器变量进行赋值?过程连续赋值不能够对寄存器变量赋值,而不可用于对连线型变量赋值?这两句话不矛盾吗?

        目前我能肯定的是,在语句块外部,assign只能对wire型变量赋值(assign a = b),不能对reg型赋值;而在initial或always中,reg型可以直接赋值(a=b)和用assign进行赋值,assign不能对wire型赋值,wire型变量也不能单独用个=来赋值。用force不会报错,但还是以常规的为主。即initial/always用reg型,wire用于连线。

3.2.5 条件分支语句

        if-else语句

        条件语句只能在initial和always语句下的begin-end中使用。if括号中的判断若为0、x、z,按“假”处理,若为1,按“真”处理。

        case语句

        case(控制表达式)

                        值1:语句块1

                        值2:语句块2

                         ...

                        值n:语句块n

                        default:语句块n+1

        endcase

        case语句括号中的内容进行比较时,是一种全等比较;值1到值n必须各不相同;如果连续几个比较值执行的是同一条语句,则这几个值可用逗号间隔;default必须带上,虽然书上说前面列举完了所有情况时,default可以忽略,但现实中很少全部完成。

3.2.6 循环语句

        VHDL有4种循环语句,forever,repeat,while,for。

        1.forvver,引导的循环语句表示永久循环,一般用在initial中。

        2.repeat 
        关键字“repeat”所引导的循环语句表示执行固定次数的循环。

        3.while与for同C语言中相对于的一样。

        所有的硬件电路都可以用其他程序代替循环语句,一般循环用的较少。


3.3结构化建模 

        这部分的内容就是例化模块,在FPGA的例程中有学习。调用模块的格式为:

        模块名  实例名(端口名列表(.x(x))

        同一个模块在当前模块中被调用几次,则需要用不同的实例名加以标识。当调用模块里面的端口位宽与当前模块不一致时:

        调用模块,并改变该模块中的参数值,两种方式,1种是例化函数中改,另一种是用defparam在例化函数后面加一条语句,均在FPGA学习(6)和(7)中体现。

3.3.1 门级模块调用

        目前还未涉及?

4.VerilogHDL数字逻辑电路设计方法

主要是讲了一些具体的数字电路例子,与语法关系不大。

        

        

        

        


http://www.mrgr.cn/news/63284.html

相关文章:

  • 扫雷(C语言)
  • 开源协议类型及长安链开源协议介绍
  • SemiDrive E3 多核心运行 FreeRTOS 配置介绍
  • Pytest-Bdd-Playwright 系列教程(6):在测试步骤函数中设置别名数据共享
  • vue自定义组件实现v-model双向数据绑定
  • nmcli、ip、ifcfg配置网络区分方法
  • PMP每日一练(二十一)
  • Spring Boot JPA中的Page组件详解
  • JavaScript 入门指南
  • 1. 让我们聊聊 Netty:高性能网络通信库
  • Tita:什么是 360 评估?
  • 计算机低能儿从0刷leetcode | 34.在排序数组中查找元素的第一个和最后一个位置 | 二分法
  • .net 在线客服系统,到底能不能处理 50万 级消息量,系统架构实践
  • HTTP返回码和其含义
  • Vue中ref、reactive、toRef、toRefs的区别
  • 超萌!HTMLCSS:超萌卡通熊猫头
  • 卷积、卷积操作、卷积神经网络原理探索
  • SpringMVC课时1
  • 简单的ELK部署学习
  • 排序——万亿数量级
  • linux基本指令之文件操作
  • 域控操作二十四:主域故障辅域接替
  • 安装Docker环境的两种方式
  • Vue3+TypeScript+Vite 后台管理项目
  • 走进智慧工地
  • 【Python】网络请求与数据获取:Requests库的使用与技巧