跟我一起学FPGA (二) 语法讲解

2024-09-04 03:28
文章标签 讲解 语法 fpga 一起

本文主要是介绍跟我一起学FPGA (二) 语法讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本章讲解

1 、Verilog 概述和基础知识;
2 、Verilog 程序框架和高级知识点;
3 、Verilog 编程规范。

1.Verilog 概述和基础知识

Verilog 是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能.
verilog的逻辑值:
逻辑 0 :表示低电平,也就是对应我们电路的 GND
逻辑 1 :表示高电平,也就是对应我们电路的 VCC
逻辑 X :表示未知,有可能是高电平,也有可能是低电平;
逻辑 Z :表示高阻态,外部没有激励信号是一个悬空状态。

verilog标识符

标识符 (identifier )用于定义模块名、端口名和信号名等。
Verilog 的标识符可以是任意一组字母、数 字、$ _( 下划线 ) 符号的组合。
       1. 标识符的第一个字符必须是字母或者下划线。
        2. 区分大小写。
        
        不建议大小写混合使用,普通内部信号建议全部小写,参数定义建议大写,另外信号命名最好体现信 号的含义。

Verilog 的数字进制格式

二进制表示如下: 4’b0101 表示 4 位二进制数字 0101
十进制表示如下: 4’d2 表示 4 位十进制数字 2 (二进制 0010 );
十六进制表示如下: 4’ha 表示 4 位十六进制数字 a (二进制 1010 ),十六进制的计数方式为 0 1 , 2…9, a b c d e f ,最大计数为 f f :十进制表示为 15 )。
当代码中没有指定数字的位宽与进制时,默认为 32 位的十进制,比如 100,实际上表示的值为 32’d100

 Verilog 的数据类型

寄存器类型、线网类型和参数类型

寄存器类型

        表示一个抽象的数据存储单元,它只能在 always 语句和 initial 语句中被赋值。

//reg define
reg [ 31 : 0 ] delay_cnt ; //延时计数器
reg key_flag ; //按键标志
线网类型
        Verilog 结构化元件间的物理连线。它的值由驱动元件的值决定。
        其中最常用的就是 wire 类型
 
//wire define
wire data_en ; //数据使能信号
wire [ 7 : 0 ] data ; //数据
       
参数类型
        参数其实就是一个常量,常被用于定义状态机的状态、数据位宽和延迟大小等。
//parameter define
parameter DATA_WIDTH = 8 ; //数据位宽为8位

 Verilog 的运算符

七种:
1 、算术运算符、 2 、关系运算符、 3 、逻辑运算符、
4 、条件运算符、 5 、位运算符、
6 、移位运算符、 7 、拼接运算符

2.Verilog 程序框架

关键字

程序框架

3.Verilog 高级知识点

阻塞赋值(Blocking        

        阻塞赋值,顾名思义,即在一个 always 块中,后面的语句会受到前语句的影响,具体来说,在同一个 always 中,一条阻塞赋值语句如果没有执行结束,那么该语句后面的语句就不能被执行,即被 阻塞
        阻塞赋值 “= ” 在 begin end 之间的语句是顺序执行,属于串行语句

非阻塞赋值(Non-Blocking

        符号“<=”用于非阻塞赋值(如:b <= a;

非阻塞赋值是由时钟节拍决定,在时钟上升到来时,执行赋值语句右边,然后将 begin-end 之间的所有赋值语句同时赋值到赋值语句的左边。
注意:是 begin—end 之间的所有语句,一起执行,且一个时钟只执行一次,属于并行执行语句。

区分

        在描述组合逻辑电路的时候,使用阻塞赋值,比如 assign 赋值语句和不带时钟的 always 赋值语句。这种电路结构只与输入电平的变化有关系。

        在描述时序逻辑的时候,使用非阻塞赋值。

 assign always 区别

assign 语句使用时不能带时钟。
always 语句可以带时钟,也可以不带时钟。
        在 always 不带时钟时,逻辑功能和 assign 完全一致,都是 只产生组合逻辑。比较简单的组合逻辑推荐使用 assign 语句,比较复杂的组合逻辑推荐使用 always 语句。

latch 锁存器

是一种对脉冲电平敏感的存储单元电路。
锁存器和寄存器都是基本存储单元:
        锁存器是电平触发的存储器,组合逻辑产生的。
        寄存器是边沿触发的存储器,时序电路中使用,由时钟触发产生的。
latch 的主要危害是会产生毛刺(glitch),这种毛刺对下一级电路是很危险的。并且其隐蔽性很强, 不易查出。因此,在设计中,应尽量避免 latch 的使用。  

 状态机

        状态机相当于一个控制器,它将一项功能的完成分解为若干步,每一步对应于二进制的一个状态,通过预先设计的顺序在各状态之间进行转换,状态转换的过程就是实现逻辑功能的过程。

 4.Verilog 编程规范

工程组织形式

        工程的组织形式一般包括如下几个部分,分别是 docparrtl sim 四个部分。

        doc:一般存放工程相关的文档        

        par:主要存放工程文件和使用到的一些 IP 文件;

        rtl:主要存放工程的 rtl 代码,这是工程的核心,文件名与 module 名称应当一致。
        sim:主要存放工程的仿真代码

文件头声明

        每一个 Verilog 文件的开头,都必须有一段声明的文字。包括文件的版权,作者,创建日期以及内容介绍等。
        我们建议一个.V 只包括一个 module ,这样模块会比较清晰易懂。

这篇关于跟我一起学FPGA (二) 语法讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1134863

相关文章

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

javascript fetch 用法讲解

《javascriptfetch用法讲解》fetch是一个现代化的JavaScriptAPI,用于发送网络请求并获取资源,它是浏览器提供的全局方法,可以替代传统的XMLHttpRequest,这篇... 目录1. 基本语法1.1 语法1.2 示例:简单 GET 请求2. Response 对象3. 配置请求

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce

CSS引入方式和选择符的讲解和运用小结

《CSS引入方式和选择符的讲解和运用小结》CSS即层叠样式表,是一种用于描述网页文档(如HTML或XML)外观和格式的样式表语言,它主要用于将网页内容的呈现(外观)和结构(内容)分离,从而实现... 目录一、前言二、css 是什么三、CSS 引入方式1、行内样式2、内部样式表3、链入外部样式表四、CSS 选

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

Java使用Stream流的Lambda语法进行List转Map的操作方式

《Java使用Stream流的Lambda语法进行List转Map的操作方式》:本文主要介绍Java使用Stream流的Lambda语法进行List转Map的操作方式,具有很好的参考价值,希望对大... 目录背景Stream流的Lambda语法应用实例1、定义要操作的UserDto2、ListChina编程转成M

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT