【FPGA开发】Verilog 基础

news2024/11/17 13:26:07

ad3718d78f554c928635349fc40a3bd1.png

写在前面:本章将对 Verilog 进行简要介绍,并对其基本特性进行讲解说明。之后,我们将按步骤演示如何使用 Vivado 创建简单项目。手动实践部分将根据我们提供的 .v 和 .tb 代码,跟着步骤跑出 Simulation 结果即可。


Ⅰ. Verilog 基础速览

0x00 什么是 Verilog

HDL(Hardware Description Language),硬件描述语言。

Verilog 是一种用于描述电子系统的硬件描述语言(HDL)。它可以用来描述数字系统的结构和行为,并可以用于系统设计、模拟和综合。Verilog 最初是在 1984 年开发的,现在是电子设计自动化行业中使用最广泛的 HDL 之一。

Verilog 作为一种语言,它可以用于多种用途,包括电路设计、验证和实现。它具有类似于 C 语言的语法,因此用户可以轻松访问它。if 和 while 等控制结构相同,输出例程和运算符也相同差不多一样。与 C 语言这些语言不同,硬件描述语言的语法和含义描述了时间和并发性。还有就是的开头和结尾没有花括号,而是用 Begin 和 End 来区分。

 

0x01 Verilog 模块

module 模块名(端口列表) ;

port 声明
reg 声明
wire 声明
parameter 声明

    子模块实例
    初识Gate
    always、initial
     assign 
    function, task 定义
    function, task 调用

endmodule

📚 Verilog 分为三个主要部分:头部、声明、主体。

  • 头部以关键字 module 开头,后面跟模块名与端口列表,并以分号结尾。和大多数编程预压那一页,Verilog 也是不能用关键字命名的。
  • 声明部分包含方向、位宽和reg 和 wire 声明、参数声明等模块,即声明需要的东西。
  • 主体部分表示电路的功能、操作、结构等。它由各种 Verilog 语句组成。

 

0x02 Verilog 数据类型

e84f81be32b04d6d8ba14f92b350a445.png  

Input:输入信号

Output:输出信号

寄存器:抽象存储设备

  • reg :通过程序赋值语句(always,initial)接收值的个体。
  • integer:整型变量
  • time, realtime:时间类型的变量(在需要时序检查的情况下处理仿真时间)
  • real:实数型变量

Net : 设备的物理连接
wire :指示变量在模块中的连接方式。
tri:用于将导线相互连接。与 wire 不同,tri 用于 tri-state net。

 

0x03 Verilog HDL 的常数声明

当声明一个限制位数的 reg 值时:

(位数)'(输入格式)(输入值)

未指定大小的值(未指定大小也可以声明):

214;    [整数 214]
‘h32;   [16进制的 32]
‘o324;  [8进制的 324]

指定大小的值(在开头声明位数):

4’b1111;  [4bit的 2进制 1111]
4’hf;     [4bit的 16进制 f(=4’b1111)]
4’d15;    [4bit的 10进制 15(4’b1111)]

有符号数的处理(负值作为二进制补码处理):

-8'd6;   [8bit的 -6]

 

0x04 Verilog 操作符

普通操作符:

符号功能符号功能
{} , {{}}结合,循环^异或
+, - , * , / , **算数^~ 或 ~^bit位等价
%取余&and
>, >=, <, <=关系~&nand
论理否定or

 

 

 

 

 

 

 

// X=4'b1010, Y=4'b1101,Z=4'b10x1 

~X       // Negation, Result is 4'b0101 
X&Y      // Bitwise AND, Result is 4'b1000 
X | Y    // Bitwise OR, Result is 4'b1111 
X^Y      // Bitwise XOR, Result is 4'b0111 
X^~Y     // Bitwise XNOR, Result is 4'b1000 
X&Z      // Bitwise AND, Result is 4'b10x0

 

移位操作符:

符号功能符号功能
<<左移>>右移

 

 

 

 

// X=4'b1101

Y=X>>1   // Y is 0110 (0 is filled in MSB position)
Y=X<<2   // Y is 0100 (0 is filled in LSB position)

 

条件运算符:

conditional_expression = exp1 ? exp2 : exp3

 

连接运算符(Concatenation Operators):    { }

// A = 1’b1 , B=2’b00 , C=2’b10
Y = {B,C}             // Results Y is 4’b0010
X = {A, B, 3’b110}    // Result X is 6’b100110
Z = {A, B[0], C[1]}   // Result Z is 3’b101

复制运算符(Replication Operators):    {{ }}

//A = 1’b1 , B = 2’b01 , C = 2’b00
Y = {4{A}}               // Result Y is 4’b1111
X = {4{A},2{B}}          // Result X is 11110101
Z = {4{A}, {2{B}, C}     // Result Z is 1111010100

 

0x05 Timescale

'timescale <时间单位> / <精密度>

<时间单位>:如果声明了该值,则文件中的所有时间单位都更改为声明的值。

(举个例子,如果声明“1ns”,文件中的所有时间单位都变为 1ns)

<精度> :表示给定时间单位内的最小可构成延迟,与 <时间单位> 关联使用,表示可使用的小数点的范围。

'timescale 10ns/1ns 
      #1.55a=b; 
// 所有时间单位都是10ns,1.55*10ns = 15.5ns。
// 此处精度值向上舍入为1ns,结果为16ns。


'timescale 1ns/1ps 
      #1.0055a=b; 
// 所有时间单位都是1ns,所以1.0055*1ns = 1.0055。 
// 此处精度值向上舍入到1ps,得到1.006ns。 (1ps=0.001ns)

 

0x06 assign 语句

assign

当输入操作数的值中发生变化(event)时,assign 语句都会计算右侧的表达式。
因此该值具有围绕赋值语句驱动(drive)net 的硬件特性。
简单来说,就是用来给 net 变量赋值一个特定的逻辑值。

deassign

deassign 语句用于消除 assign 语句对变量的影响。

14dcddbdc9d8424083eed445ecaf9141.png

assign wire1 = reg1;  // 简单的连接线
assign wire2 = (pin1) ? reg2[0] : reg2[1];  
assign wire2 = {reg1,reg2[0]};   // 将两个不同的信号放入一个总线

 

0x07 alway 语句

always 语句在仿真运行时重复执行,因此它对于与时序控制相关的表达式很有用。@(sensitivity_list) 控制 always 语句的执行,并响应灵敏度列表中列出的一个或多个信号。当事件(event)发生时,总是执行里面的 begin-end 块。

always @(sensitivity_list) begin
// Blocking or nonBlocking statements;
end

 

0x08 initial 语句

与在模拟过程中无限重复的 always 语句不同,initial 语句仅在模拟运行时执行一次。
initial 语句的开始-结束块由过程语句组成,这些过程语句按列出的顺序执行。

initial begin
// Blocking or nonBlocking statements;
end

 

0x09 赋值语句

这些语句按照它们列出的顺序执行,并且具有更新赋值语句左侧变量值的软件特性。

always 语法,在 initial 语句中使用。

阻塞语句(Blocking statement):

  • blocking 符号:  =
  • Begin ~ end 位置 Line by Line 的顺序计算并完成保存
  • 当任务都执行完毕后执行下面语句 -> 即,语句在执行完成之前 blocking
  • #t 变量 = 计算;    ->  t事件后,计算并分配给变量。
变量 C = A & B;   //读取A和B的值进行 & 运算并赋值给C. 然后执行下一条语句
变量 D = A | B;   // 读取A和B的值进行 | 运算并复制给D,此时它们的执行过程没有延迟

 

非阻塞语句(Non blocking statement):

  • non Blocking 符号:<=
  • 在执行完从 Begin ~ End 的所有计算后,立即执行保存操作。
  • 多个非阻塞语句同时求值后分配。
  • 变量 <= #t 计算;    -> 计算t 后,保留变量赋值。

(* 用于在共同事件发生后同时传输多个数据)

变量 C <= A & B;     // 读取A和B的值,并进行&操作
变量 D <= A | B;     // 同时读取A和B的值, |操作, 然后将它们同时分配给 C 和 D。

💬 Verilog Blocking 语法举例:

77a36c47b84d46e1b224db43e84f2965.png

c1051a7ccc0142ebac5ed2033d2d5f1c.png

 

Ⅱ. 动手操作

cabca19d70f2411ebd65c79e351f5cf6.png

360f78b68d984bd78fe82e94f3ddf9c6.png

43890eca8c214096bd6a868453f1661a.png

 70381ba6b5304603996dd20b7951ce84.png

 6d5610074f894fea86f149ed9dd08a4e.png

df1428850c244b8ea6148084f9b78997.png

f21a52014b114252a06bf686743bd113.png

2ead50cc4df04a74b08c4ecb44b18c60.png

f71e351d9f9743088615787edcd3aec1.png

🔍 我的是 xc7a75tfgg484:71db7d2e8460476e8b804f11c5883745.png

继续点 Finish:

bcd77ed9189f46e0a5a591470316b58b.png

在创建项目,等一会:

019ebf1cc7a14db5bb5916ff9b68fcdf.png

 5f01548f1f9042b89373a5623e0aae43.png 

 保存项目:

e8c9971663e642dbb116d5573d4eff1a.png

 

 我们来写点代码试试:

4dc9ee6ac7444d78a66188ca169d331a.png

 💬 inv.v

`timescale 1ns / 1ps

  module inv(
  input a,
  output y
  );

assign y = ~a;
 

endmodule

再创建一个 csdn.tb 的 Sources:

e68535ffb9ef453483c7fbea3f0fa7cf.png

💬 csdn.tb​​​​​​​

`timescale 1ns / 1ps

module inv_tb;

reg aa;

wire y;

inv u_inv (
.a (aa ),
.y (y ) );

initial aa = 1'b0;
always aa = #100 ~aa;

initial begin
        #1000
        $finish;
end

endmodule

 仿真:

ec0493a7b13345ec883c3aae3213de7c.png

等待

 f0e8e6d4c873456ea2fdb23a4c41d355.png

🚩 仿真结果如下:

0f5e8840580b42d9bb48f62c8b9cfc36.png

 

7a80245f0b5f4021a033b3789a9efdeb.png

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2022.9.20
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Introduction to Logic and Computer Design, Alan Marcovitz, McGrawHill, 2008

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

 

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

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

相关文章

Odoo 16 企业版手册 - 库存管理之产品追溯

产品追溯 Odoo提供的产品可追溯性功能将有助于跟踪和跟踪产品的每个组件。在库存移动的每个阶段跟踪产品对于控制所有操作是必要的。为了确保有效监控库存的走势&#xff0c;批号和序列号发挥着重要作用。从制造过程到交付操作&#xff0c;产品可追溯性将保持适当的跟踪&#x…

Mixlab 的自我介绍

‍‍‍‍2022在探索元宇宙落地过程中&#xff0c;走过不少弯路&#xff0c;本着 “孵化” 的初心&#xff0c;我们将继续探索面向未来的社区模式。1 / Mixlab 无界社区社区即服务&#xff0c;以此作为基础&#xff0c;孵化各种形态的产品/服务。在2022的白皮书记录了我们做社区…

数据结构与算法—链表之单链表

文章目录链表单链表结构和特点创建添加修改删除2023年的第一篇文章在开发过程中&#xff0c;选择合适的数据结构是很重要的&#xff0c;可以快速处理数据的存储及使用问题。计划有时间慢慢系统的学习《数据结构与算法》&#xff0c;看看视频&#xff0c;练习实践&#xff0c;最…

国产FPGA应用--易灵思Programming Mode完全解析

本文介绍易灵思的几种配置模式&#xff0c;方便大家参考。 一、易灵思下载模式&#xff1a; 二、下载模式选择&#xff1a; 1、SPI Active mode 时序图如下&#xff1a; 2、SPI Passive Mode 时序图如下&#xff1a; SPI Active using JTAG Bridge 实际项目中&#xff0c;SPI…

锥度张力控制(收卷应用)

收卷、放卷应用系列文章可以参看下面的文章链接: 变频器简单张力控制(线缆收放卷应用)_RXXW_Dor的博客-CSDN博客_收放卷应用张力控制的开闭环算法,可以查看专栏的其它文章,链接地址如下:PLC张力控制(开环闭环算法分析)_RXXW_Dor的博客-CSDN博客。https://blog.csdn.ne…

excel筛选技巧:不用函数公式也能快速多对多查找

说到excel中的筛选&#xff0c;想必大家早已是了如指掌&#xff0c;不过增强版的筛选&#xff0c;你听说过吗&#xff1f;它可比普通的筛选厉害多了&#xff0c;不仅能实现excel中的一对多查找&#xff0c;就连复杂的多对多查找也不在话下&#xff01; 其实是使用公式还是用其…

原子性 以及悲观锁, 乐观锁

1. 前言 今天这篇文章要详细的说说&#xff0c;什么叫原子性&#xff0c;以及如果不是原子性的话&#xff0c;怎么能保证原子性。 2. 原子性 先说下并发编程的三大特性&#xff1a;可见性, 有序性, 原子性。 无论是在什么语言&#xff0c;原子性都是非常重要的&#xff0c;既然…

elasticsearch 的基本操作多维度分享

目录 一、索引操作 二、映射操作 三、文档操作 elasticsearch 的基本操作多维度分享此篇正式分享&#xff0c;具体包括索引、映射、文档的相关处理&#xff0c;模拟生成环境&#xff0c;通过DSL语句和java的高级REST形式全方位展示给大家&#xff1b; 一、索引操作 1、创建…

2023超好用的Mac清理优化工具CleanMyMacX

CleanMymac X Mac版本&#xff0c;以一种全面的方式扫描Mac系统以允许垃圾隐藏&#xff0c;您只需要轻松单击左鼠标按钮即可清洁数字G的垃圾&#xff0c;这是如此简单。立即提高您的MAC速度。为Apple System计算机建造可以帮助用户清理多种类型的垃圾和其他恶意束&#xff0c;提…

Sentinel 控制台安装与详解

Sentinel 控制台包含如下功能: 查看机器列表以及健康情况&#xff1a;收集 Sentinel 客户端发送的心跳包&#xff0c;用于判断机器是否在线。监控 (单机和集群聚合)&#xff1a;通过 Sentinel 客户端暴露的监控 API&#xff0c;定期拉取并且聚合应用监控信息&#xff0c;最终可…

AIGC + 任意应用情景组合,从技术层面给了大家体验不同领域的创作的机会

还在为学技术的时候面对一大堆教程苦恼&#xff1f;画画、剪辑、建模 ... 啥啥啥都想学 &#x1f92f;AIGC 来解决&#xff01;&#xff01;每个人都有机会当五分钟艺术家&#xff01;AIGC 究竟有多强大&#xff1f;简单用一个公式来概况 AIGC 的强大之处&#xff0c;就是 AIG…

Harbor 镜像仓库

目录 一、Harboar概述 1.1 什么是 Harbor 1.2 Harbor优势 1.3 Harbor构成 1.4 Harbor的误区 二、Harbor 安装&#xff08;http&#xff09; 2.1 两种方式 2.2 具体安装步骤 2.2.1 先安装Docker和Docker Compose 2.2.2 下载Harbor 2.2.3 harbor.yml 的hostname 2.2.…

梳理一下我在2022年读过的23本书

作者 | gongyouliu编辑 | gongyouliu2022年我一共看了23本书&#xff0c;比自己之前定的目标——每年看36本书——少了不少。今天特意花大半天时间写一篇文章来整理一下今年看的书&#xff0c;梳理一下自己的思路&#xff0c;也算是留下一份记录。这份书单也希望给大家作为参考…

从这两道题重新理解,JS的this、作用域、闭包、对象

日常开发中&#xff0c;我们经常用到this。例如用Jquery绑定事件时&#xff0c;this指向触发事件的DOM元素&#xff1b;编写Vue、React组件时&#xff0c;this指向组件本身。对于新手来说&#xff0c;常会用一种意会的感觉去判断this的指向。以至于当遇到复杂的函数调用时&…

spring、mybatis、spring-mybatis、springboot-mybatis的配置文件

第一个Spring程序 第一个Mybatis程序 第一个Spring-Mybatis程序 第一个SpringBoot-Mybatis程序 1. Spring程序配置文件 beans.xml&#xff1a;/resources <!--注册一个Bean--><bean id"hello" class"com.kuang.pojo.Hello"><property nam…

03 I2C

特点 两根线 SCL SDA同步、半双工带数据应答支持总线挂载多设备 一主多从 多主多从 两个功能&#xff1a; 读取外设模块指定位置的寄存器写外设模块指定位置的寄存器一个完整的通讯协议一定是在软件和硬件上同时定义的。 硬件 所有的I2C设备的时钟线与数据线都要连在一起设备…

普元技术专家2022历史文章合集

大家好&#xff0c;新年快乐。‍献上2022年历史文章合集&#xff0c;方便你翻阅过去一年里的精华文章。【第一辑】企业服务总线&#xff08;ESB&#xff09;基于ESB的企业服务集成平台建设之道企业服务总线建设之道的探索与研究零代码能力干掉80%开发工作&#xff1a;普元ESB 8…

论文综述——Event-Event Relation Extraction using Probabilistic Box Embedding

Event-Event Relation Extraction using Probabilistic Box Embedding1 任务介绍2 Box Embedding3 BERE模型4 实验5 总结1 任务介绍 事件关系抽取&#xff1a;文本中包含多个事件e1,e2,…,en&#xff0c;识别每个事件对(ei,ej)之间的关系r(ei,ej) 子事件(Subevent)关系抽取&a…

(一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>

一、工作环境及项目简介 立创EDA&#xff1a;硬件原理图及PCB绘制。 全志F1C200S&#xff1a;F1C100S内置32MB DDR1内存&#xff0c;F1C200S内置64MB DDR1内存。 原理图&#xff1a;参考开源项目&#xff0c;详见墨云&#xff0c; 详见peng-zhihui。 核心板&#xff1a;四层…

Java8 - Streams flatMap()

文章目录What is flatMap()?Why flat a Stream?DemoWhat is flatMap()? # Stream<String[]> # Stream<Stream<String>> # String[][][[1, 2],[3, 4],[5, 6] ]它由一个 2 级 Stream 或一个二维数组组成 。 在 Java 8 中&#xff0c;我们可以使用 flatMap…