FPGA学习篇——Verilog学习1

ops/2025/2/6 17:23:22/

1 数电基础知识(后续可能还会继续补充)

1.1 逻辑电平

        这张图比较重要以及陌生的应该是高阻态Z,他是一个未知值,不一定为高也不一定为低电平,X是只能高电平和低电平中二选一。

1.2 进制

        进制有常见的二进制(b)、八进制(o)、十进制(d)、十六进制(h)

        十进制就是我们日常生活常用的阿拉伯数字0~9,而计算机中主要存储的是二进制,所以主要是二进制与十进制的转换,而八进制和十六进制可以先转换为二进制,进而转换为10进制。

1.2.1 十进制 and 二进制

(1)二进制\rightarrow十进制:加权求和

(2)十进制\rightarrow二进制:不断除2取余,逆序排列

1.2.2 八进制 to 二进制(八进制\rightarrow二进制)

        八进制代表数字0~7,对应的是二进制加权系数的1~8,即下图:

        二进制与八进制的换算,只需将二进制串划分成每三个位一组(如果需要的话,在前面补零),然后按照上表的对应关系进行转换。

        

PS:八进制也可直接转换为十进制:

1.2.3 十六进制 to 二进制

        十六进制代表阿拉伯数字的0~15,其中0~9同阿拉伯数字一样,10~15则有abcdef代替,即十六进制有1,2,3,4,5,6,7,8,9,a,b,c,d,e,f。

        二进制数与十六进制的换算,只需将二进制串划分成每四个位一组(如果需要的话,在前面补零),然后按照上表的对应关系进行转换。

        例如,十六进制数1A3F转换为二进制数为0001 1010 0011 1111。

进制的表示:

如下图,4代表对应的二进制数数据的位宽(因为在数字电路中数字都是以二进制存储的),b是进制前缀,这里是二进制(在Vreilog语言中,若没有指定位宽,则默认为32,若没有指定进制,则默认为十进制d)

2 Verilog语言——基本语法

2.1 Verilog中的标识符(可理解为起个名字)

 在Verilog语言中标识符就相当与C语言的变量名,简单理解就是给参数,函数等起个名字。

2.2 Verilog中的数据类型

在Verilog语言中,主要三大数据类型:寄存器数据类型,线网数据类型,参数数据类型。

2.2.1寄存器数据类型

        寄存器数据类型可简单理解为定义用Verilog语言编程定义一个寄存器在数电中学过寄存器,实际上就是抽象的硬件设计,相当于你写了这个代码,对应着就生成一个硬件寄存器)。

        定义方法: reg [a:b]  标识符(寄存器名称);

        其中,a:b为寄存器的位宽(高位在前,低位在末),如以下例子中31:0即定义了32位的寄存器。当未定义位宽时,默认位宽为1。

        

  • 寄存器表示一个抽象的数据存储单元,通过赋值语句可以改变寄存器储存的值,即寄存器可存储值。reg 类型数据的默认初始值为不定值x(即高电平或者低电平)。
  • reg类型的数据只能在 aways 语和initial 语句中被赋值
  • 如果该过程语句描述的是时序逻辑,即alwavs语句带有时钟信号,则该寄存器变量对应为触发器。
  • 如果该过程语句描述的是组合逻辑,即alays语句不带有时钟信号,则该寄存器变量对应为硬件连线。

2.2.2 线网数据类型

        线网数据类型可理解为用Verilog编程定义一条线,对应于硬件电路中结构实体(如门与门之间)的连线。线网数据包括wire和tri类型(用法完全一致),基本我们用到的是wire类型,故以下只讲wire类型。

      定义方法: wire [a:b]  标识符(寄存器名称);

      同样,这里a:b为寄存器的位宽(高位在前,低位在末),当未定义位宽时,默认位宽为1。

  • 线网类型的变量不能储存值,它的值是由驱动它的元件所决定的。可以理解为电路时连线上的值(如电压和电流值)跟元件有关。
  • 驱动线网类型变量的元件有门、连续赋值语句、assign等(这里可将连续赋值语句和assign语句是一个抽象的电路元件,故其可以给连线传递值)。
  • 如果没有驱动元件连接到线网类型的变量上,则该变量就是高阻的,即其值为z(即不定态)。

2.2.3 参数数据类型

        参数其实就是一个常量,类似于C语言中define的作用。在 Verilog HDL 中用 parameter 定义常量。参数型数据常用于定义状态机的状态、数据位宽和延迟大小等。

用参数数据类型的好处:

        比如上图是一个状态机的几种参数,当一个程序中需要多种类型的状态机(即参数不同),则可直接修改程序中的parameter部分,而不用到代码中具体去修改行同步等于多少...等等。

2.3 Verilog中的运算符

说白了就是编写代码时用什么符号来表示加减乘除等运算。

直接上图!!!

关系运算符:

        这个条件运算符是Verilog独有的,相当于C语言中简单的if语句,问号前面是判断条件,:左右两侧为两种选择结果,如下例:

上式表示如果a>b为真,选a,否则选b,即将a和b中的最大值赋给result。

注意:位运算是每位对应做运算,若ab位数不同,则高位补零至相同位数在再运算。

        拼接运算符也是Verilog中独有的运算符。举例讲解:

        假设ab都是8位数据,下例则是将a的所有八位和b的低四位拼接在一起,因此,c一共是12位数据。

除此之外,多个运算符使用时要注意运算符的优先级!!!可使用括号来提高优先级。


http://www.ppmy.cn/ops/156202.html

相关文章

第一性原理:游戏开发成本的思考

利润 营收-成本 营收定价x销量x分成比例 销量 曝光量x 点击率x (购买率- 退款率) 分成比例 100%- 平台抽成- 税- 引擎费- 发行抽成 成本开发成本运营成本 开发成本 人工外包办公地点租金水电设备折旧 人工成本设计成本开发成本迭代修改成本后续内容…

OpenCV:特征检测总结

目录 一、什么是特征检测? 二、OpenCV 中的常见特征检测方法 1. Harris 角点检测 2. Shi-Tomasi 角点检测 3. Canny 边缘检测 4. SIFT(尺度不变特征变换) 5. ORB 三、特征检测的应用场景 1. 图像匹配 2. 运动检测 3. 自动驾驶 4.…

汇编知识点汇总

汇编的组成 汇编指令 数据处理指令 数据搬移指令数据位移指令位运算指令算术运算指令比较指令 跳转指令内存读写指令状态寄存器传送指令异常产生指令协处理器指令 伪操作 在程序编译过程中起到编译引导作用的内容 .text .global .if .else .endif 伪指令 不是汇编指令&…

jdk8 G1收集器怎么手动调优

在 JDK 8 中,手动调优 G1 垃圾收集器可以通过以下步骤和参数进行: 1. 启用 G1 垃圾收集器 要启用 G1 垃圾收集器,需要在 JVM 启动参数中添加以下选项: -XX:UseG1GC 这个参数告诉 JVM 使用 G1 作为垃圾收集器。 2. 设置堆内存…

国防科大:双目标优化防止LLM灾难性遗忘

📖标题:How to Complete Domain Tuning while Keeping General Ability in LLM: Adaptive Layer-wise and Element-wise Regularization 🌐来源:arXiv, 2501.13669 🌟摘要 🔸大型语言模型(LLM…

了解linux-5.4.31/drivers/gpio/gpiolib-devres.c中的devm_gpiod_get_optional()函数

1、打开“drivers/gpio/gpiolib-devres.c” /** 获取GPIO线的索引,查找“设备资源”,分配“设备资源数据”,注册“设备资源”; * devm_gpiod_get_optional - Resource-managed gpiod_get_optional() * dev: GPIO consumer * con_id: function within the GPIO consumer * fla…

LabVIEW自定义测量参数怎么设置?

以下通过一个温度采集案例,说明在 LabVIEW 中设置自定义测量参数的具体方法: 案例背景 ​ 假设使用 NI USB-6009 数据采集卡 和 热电偶传感器 监测温度,需自定义以下参数: 采样率:1 kHz 输入量程:0~10 V&a…

【数据结构】_链表经典算法OJ:相交链表

目录 1. 题目链接及描述 2. 解题思路 2.1 思路1:一个链表把另外一个链表的结点逐个轮一遍 2.2 思路2:截断长链表,从距离交点结点前等距处开始同时遍历(本题解法) 3. 程序 关于解题程序的细节: 3.1…