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

FPGA学习篇——Verilog学习1

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.kler.cn/a/533785.html

相关文章:

  • 25.2.5学习记录
  • 【大数据技术】用户行为日志分析(python+hadoop+mapreduce+yarn+hive)
  • 计算机网络——三种交换技术
  • 33.Word:国家中长期人才发展规划纲要【33】
  • Web - CSS3浮动定位与背景样式
  • 安全策略实验报告
  • Shell条件变量替换
  • PySpark学习笔记5-SparkSQL
  • 在游戏本(6G显存)上本地部署Deepseek,运行一个14B大语言模型,并使用API访问
  • 记录debian12运行时出现卡死的问题
  • http状态码:请说说 503 Service Unavailable(服务不可用)的原因以及排查问题的思路
  • Windows Docker笔记-简介摘录
  • Java synchronized锁升级
  • 算法与数据结构(括号匹配问题)
  • w192中国陕西民俗网的设计与实现
  • 从BIO到NIO:Java IO的进化之路
  • deepseekLLM发展历程
  • ElasticSearch学习笔记-解析JSON格式的内容
  • 硬件工程师笔试基础题目
  • 数字化转型:概念性名词浅谈(第四讲)
  • DS图(下)(19)
  • 【算法】经典博弈论问题③——斐波那契博弈 + Zeckendorf 定理 python
  • 基于YUV的色相调节(一)
  • Leetcode 78. 子集(全排列的变形)
  • Gauss高斯:分布键
  • DeepSeek各版本说明与优缺点分析