HDL FPGA 学习 - Avlon 总线,从端口传输、主端口传输,单周期、可变周期传输

目录

1.1 Avlon 总线

定制 外设 IP 核的框架

从端口传输

从端口信号类型

从端口传输模式列举

基本单周期读写传输

固定等待周期的读写传输

可变等待周期的读写传输(推荐)

具有建立时间和保持时间读写传输

主端口传输

主端口信号类型

主端口传输模式列举与参数说明

主端口 单/可变周期 的读传输

主端口 单/可变周期 的写传输

其它 Avalon 传输模式


编辑整理 by Staok,始于 2021.2 且无终稿。转载请注明作者及出处。整理不易,请多支持。

本文件是“瞰百易”计划的一部分,尽量遵循“二项玻”定则,致力于与网络上碎片化严重的现象泾渭分明!

本文系广泛撷取、借鉴和整理,适合刚入门的人阅读和遵守,已经有较多经验的人看一看图个乐,如有错误恭谢指出!本文已经是长期积累和堆叠而形成一定规模,不必按照从前到后的顺序去看,可以挑感兴趣的章节去看。

本文为简述风格,本意即记录要点和便于快速拾起。

本文对应的 Github/Gitee 仓库地址,本文最新的原文 和 一些源码、备查手册等等 均放在里面。


1.1 Avlon 总线

Intel FPGA Avalon 总线,其灵活特点有:

  • 时钟同步的;分主、从信号线和时序,主外设能发起传输;多主多从;
  • 主、从时钟频率可不同,位宽可不同;
  • 专用的地址总线、数据总线和控制总线,支持高达 1024 位的数据宽度、不是 2 的偶数幂的数据宽度;
  • 高性能,易实现,占用资源少,开放使用。
  • 多种模式,时延和时序可调整,定制外设 IP 核超级灵活。

若只使用 Quartus II 的 Qsys 自带的定制的 Avalon 总线外设构建 SOPC 系统,不需了解 Avalon 总线,因为这些自带外设的接口都已经写好了 Avalon 总线,在图形化连接总线时,就是在把各个外设的从 Avalon 接口挂载到 Nios II 的主 Avalon 总线上;若采用用户定制外设构建 SOPC 系统,所开发外设必须符合 Avalon 总线规范,需要熟悉 Avalon 总线。下图为典型 Avalon 架构。下图最右面上下两个外设框分别为用户自定义主端口和用户自定义从端口。

assets/典型Avalon架构.png

Avalon 主端口发起对 Avalon 总线的传输,Avalon 从端口响应来自 Avalon 总线的传输。主从端口对即在某次数据传输过程中,通过 Avalon 总线连接起来的主端口和从端口。

定制 外设 IP 核的框架

assets/定制-外设-IP-核的框架.png

从端口传输

从端口信号类型

*p.s 其中前九个(标粗体的)最常用;不带 “_ n” 后缀的都是高电平有效;还有流水线信号、突发信号、三态信号和流控信号等,没有列出。*

p.s 不带任何读写功能的、最基本信号:clk、reset_n、chipselect、address 四个,即下表中的前四个。

p.s address 地址的信号宽度最好都设置为 32 位宽,地址对齐的时候一一对应,最简便。

p.s Avalon 接口规范没有对 Avalon 外设的信号指定命名规则;Avalon 外设的信号的名字可以与信号类型名相同,也可以遵循 用户 / 系统级的命名规则。

p.s 下表只列基本信号,其它如流水线信号、突发信号、流控制信号、三态信号等不予列出。

信号类型信号宽度方向功能和使用描述
clk1INAvalon从端口的同步时钟,所有信号必须与clk同步,异步外设可以忽略clk信号。
reset_n1IN从外设复位信号。该信号有效时,从外设进入确定的复位状态。
chipselect1INAvalon从端口的片选信号。
address1~32INAvalon从端口的地址线,指定了从外设地址空间的字的地址偏移,要访问外设寄存器的地址,从0x00开始。
read1IN读从端口的请求信号。若使用了该信号,则必须使用readdata或data信号。
readdata1~1024OUT读传输时,输出到Avalon总线的数据线。若使用了该信号,则data信号不能使用。
write1IN写从端口的请求信号。若使用了该信号,必须使用writedata或data信号,writebyteenable信号不能使用。
writedata1~1024IN写传输时,来自Avalon总线的数据线。若使用了该信号,data信号不能使用。
waitrequest1OUT若从端口不能立即响应Avalon总线,用该信号来暂停Avalon总线。用于可变等待周期模式。
irq_n1OUT从外设的中断请求信号。
byteenable2,4,6,8,16,32,64,128IN按字节寻址访问使能信号。在对宽度大于8位的存储器进行写传输时,该信号用于选择特定的字节段。若使用了该信号,writedata信号必须使用,writebyteenable信号不能使用。
writebyteenable2,4,6,8,16,32,64,128IN该信号是byteenable信号和write信号的逻辑与操作。write和byteenable信号不能使用。
Begin transfer1IN在每次传输的第一个周期内有效,使用用法取决于具体外设。

32 位从端口的 byteenable 信号功能定义表如下。

byteenable[3..0]写操作
1111全 32 位写操作
00112 个低字节的写操作
11002 个高字节的写操作
0001字节 0 的写操作
0010字节 1 的写操作
0100字节 2 的写操作
1000字节 3 的写操作

IN (输入)类型的信号都是 Avalon 总线进行置位,从端口不能对其操作,从端口只能操作 OUT (输出)类型的信号。

主端口信号类型表略。

从端口传输模式列举
  • 基本单周期读写时序传输。固定等待周期的读写传输。可变等待周期的读写传输(个人推荐常用)。(只对从端口有)
  • 具有建立时间和保持时间的固定等待周期的读写传输(用于异步外设,了解)。(只对从端口有)
  • 流水线读传输(带固定延迟和可变延迟)。
  • 流控制时序传输。
  • 三态时序传输。
  • 突发时序传输。

下面分别列举时序图。可以看时序图直接上手编写逻辑,但提醒还是先多参考参考,熟悉广泛使用的成熟的编写架构和思路。

基本单周期读写传输

读时序:

assets/基本单周期读时序.png

A 沿为主端口发起 读传输,E 沿 为主端口取走要读的数据;在 E 沿之前从端口的外设必须提前在 readdata 数据线上准备好数据。

基本读传输适用于异步从外设,只要外设被选中或地址发生变化,外设就立刻返回数据。readdata 须在下一个时钟上升沿之前保持稳定。

从端口通常在 clk 下降沿 检测 chipselect 和 read 两个信号同时为高时,就认为一次读传输。

写时序:

assets/基本单周期写时序.png

A 沿为主端口发起 写传输,D 沿为主端口准备好要写的数据,在此沿从端口外设要取走数据。基本写传输适用于片内同步外设。

从端口通常在 clk 下降沿 检测 chipselect 和 write 两个信号同时为高时,就认为一次读传输。从端口可以在 D 沿取走数据。

基本写传输适用于片内同步外设。

固定等待周期的读写传输

读传输:等待周期允许从端口使用一个或多个时钟周期来捕获地址和/或返回有效 readdata,等待周期会影响从端口的吞吐量。

写传输:等待周期允许从端口使用一个或多个时钟周期来捕获地址和 writedata,等待周期会影响从端口的吞吐量。

用于同步外设访问,读传输等待周期是必须的,写传输非必须。

在 Qsys 中导入定制 IP 核时,可设要等待的固定周期,读和写时序的等待周期是一样的;可以在 clk 上升沿检测主端口的 读/写 传输。

读时序:

assets/固定等待周期读时序.png

写时序:

assets/固定等待周期写时序.png

固定等待周期写传输的一个例子:

OLED 定制外设 IP 的部分源码,从端口的写传输实现,VHDL;第二个图是软件设置固定等待周期数,要与源码中的一致。

assets/固定等待周期写-例子.png

可变等待周期的读写传输(推荐)

读传输:等待周期允许从端口使用一个或多个时钟周期来捕获地址和/或返回有效readdata,等待周期会影响从端口的吞吐量。

写传输:等待周期允许从端口使用一个或多个时钟周期来捕获地址和writedata,等待周期会影响从端口的吞吐量。

可变等待周期采用 waitrequest 信号实现,看时序图就容易明白。从端口必须在第一个总线时钟周期内设置 waitrequest 有效,直到从端口处理好数据再置 waitrequest 信号无效,然后总线在下一个时钟上升沿捕获数据,结束本次传输。

读时序:

assets/可变等待周期读时序.png

写时序:

assets/可变等待周期写时序.png

可变等待周期写传输的一个例子:

OLED 定制外设 IP 的部分源码,从端口的写传输实现,VHDL。

./assets/可变等待周期写-例子.png

具有建立时间和保持时间读写传输

具有建立时间和保持时间的固定等待周期的读写传输,用于异步外设,了解。

具有建立时间和固定等待周期的从端口读传输,对于片外从端口异步外设,在主端口发出 read 有效信号之前,需要地址和 chipselect 等信号先稳定一段时间,然后将 read 信号置位有效,这样异步外设可以在 read 上升沿开始根据其他信号做出反应,而不会引起冒险竞争,因为在 read 上升沿时其他信号均已稳定。可以设置固定等待周期。即具有建立时间、固定等待周期的读传输(建立时间和可变等待周期不能同时采用)。下图中,上面的时序图,Tsu 即建立时间。

具有建立时间和保持时间的从端口写传输,对于片外从端口异步外设,在主端口发出 write 有效信号之前,需要 address、byteenable、writedata 和 chipselect 信号保持几个周期的稳定时间。即具有建立时间、固定等待周期、保持时间的写传输。下图中,下面的时序图,C 沿到 E 沿 之间的时间 即建立时间,E 沿到 F 沿 之间的时间 即保持时间。

端口读传输和写传输的建立时间必须相同。

对于一些 ram 等芯片的时序,设置的当可以把 Avalon 总线 直连 此类芯片的总线接口,即该从端口时序通常用于片外外设。

assets/建立-保持时间时序图.png

“建立时间、固定等待周期和保持时间” 属性在 Qsys 中设置;端口读传输和写传输的建立时间必须相同;建立时间和可变等待周期不能同时采用。

主端口传输

主端口信号类型

p.s Avalon 主端口必须有三个信号:clk、address、waitrequest。

p.s 下表只列基本信号,其它如流水线信号、突发信号、流控制信号、三态信号等不予列出。

信号类型信号宽度方向必需功能及使用描述
clk1InYesAvalon主端口的同步时钟, 所有的信号必须与clk同步。
waitrequest1InYes迫使主端口等待, 直到Avalon总线准备好处理传输。
address1~32OutYesAvalon主端口到Avalon总线的地址线。 表示的是一个字节的地址, 主端口只发出字边界的地址。
read1OutNo主端口的读请求信号。 主端口不执行读传输时不需要该信号。 若使用了该信号,readdata或data信号线必须使用
readdata8,16,32,64,128,256,512,1024InNo读传输时,来自Avalon总线的数据线。 当主端口不执行读传输时,不需要该信号。 若使用了该信号,read信号必须使用,data信号不能使用。
write1OutNo主端口的写请求信号,不执行写传输时不需要该信号。使用该信号,writedata或data信号必须使用。
writedata8,16,32,64,128,256,512,1024OutNo写传输时,到Avalon交换架构的数据线。当主端口不执行写传输时,不需要该信号。使用该信号,write信号必须使用,data信号不能使用。
byteenable2,4,6,8,16,32,64,128OutNo字节使能信号。在对宽度大于8位的存储器进行写传输时,该信号用于选择特定的字节段。读传输时,主端口必须置所有的byteenable信号线有效。
Irq1,32InNo中断请求信号。 如果Irq信号是一个32位的矢量信号,那么它的每一位直接对应一个从端口上的中断信号;如果Irq是一个单比特信号,那么它是所有从外设的Irq信号的逻辑或,中断优先级irqnumber信号确定。
irqnumber6InNoirq信号为单比特信号时,使用irqnumber信号来确定外设的中断优先级。 Irqnumber的值越小,所代表的中断优先级越高。
reset1InNo全局复位信号。实现跟外设相关。
resetrequest1OutNo允许外设将整个Avalon系统复位。
主端口传输模式列举与参数说明

主端口传输模式列举:

  • 单 / 可变等待周期 的读写传输。
  • 流水线读传输(带可变延迟)。
  • 流控制时序传输;
  • 三态时序传输;
  • 突发时序传输。

主端口的等待周期、建立时间、保持时间属性:

  • 等待周期:主端口使用 waitrequest 信号接受 Avalon 总线的不确定等待周期。主端口被动地支持可变等待周期,不支持固定等待周期。
  • 建立时间和保持时间:主端口不使用建立和保持时间属性。若一个目标从外设有建立 和/或 保持时间属性,Avalon 总线管理主从端口对的信号时序的转换。
主端口 单/可变周期 的读传输

主端口 单等待周期 的读传输

主端口在 clk 上升沿后紧接着 设置目标外设地址 address 和 置 read 有效,等待 waitrequst 信号失效 便可从 readdata 取数据。

assets/主端口-单周期-的读传输.png

主端口 可变等待周期 的读传输

assets/主端口-可变周期-的读传输.png

主端口 单/可变周期 的写传输

主端口 单等待周期 的写传输

assets/主端口-单等待周期-的写传输.png

主端口 可变等待周期 的写传输

assets/主端口-可变等待周期-的写传输.png

其它 Avalon 传输模式

这里略。

  • 流水线读传输。
  • 流控制时序传输;
  • 三态时序传输;
  • 突发时序传输。
  • 中断与复位,地址对齐等内容。

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

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

相关文章

通信入门系列——双边带信号、单边带信号、Hilbert变换

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、双边带信号 二、单边…

flink sql 实战实例 及延伸问题:聚合/数据倾斜/DAU/Hive流批一体 等

flink sql 实战实例 及延伸问题 Flink SQL 计算用户分布Flink SQL 计算 DAU多topic 数据更新mysql topic接入mysql引入 upsert-kafka-connector 以1.14.4版本为例 数据倾斜问题:让你使用用户心跳日志(20s 上报一次)计算同时在线用户、DAU 指标…

1 easy 88. 合并两个有序数组

方法1: Arrays.sort //给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 // // 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 // // 注意&am…

Linux环境下C语言实现ping命令

Linux环境下C语言实现ping命令 涉及的知识点 Linux信号量的使用 SIGALRM信号是操作系统中的其中一个信号。他的作用是设置进程隔多久后会收到一个SIGALRM信号 #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> …

SSM---Mybatis查询数据库的功能

Mybatis查询数据库的功能流程&#xff1a; 在maven中加入mybatis依赖&#xff0c;mysql驱动依赖创建一张student表创建表对应的实体类&#xff1a;student类&#xff0c;用来保存表中的每行数据创建持久层的DAO接口&#xff0c;用来定义操作数据库的方法创建这个表对应的sql映…

前端发送请求,明明登录进去了,为什么获取用户信息不行,后端总是识别不到token——跨域的问题

跨域问题 今天在对接前后端的时候&#xff0c;发现明明系统的登录接口都是好的&#xff0c;但是偏偏就是获取不到用户的信息&#xff0c;后端总是报错说读取不到有效的token。 总是说请求头中读取的token是null 在经过不断的排查和上网需求帮助的时候&#xff0c;我总结了以下…

JavaWeb——007MYSQL(DQL多表设计)

# 数据库开发-MySQL 一级目录二级目录三级目录 1. 数据库操作-DQL1.1 介绍1.2 语法1.3 基本查询1.4 条件查询1.5 聚合函数1.6 分组查询1.7 排序查询1.8 分页查询1.9 案例1.9.1 案例一1.9.2 案例二 2. 多表设计2.1 一对多2.1.1 表设计2.1.2 外键约束 2.2 一对一2.3 多对多2.4 案…

ROS2高效学习第四章 -- ros2 topic 编程之自定义 msg

ros2 topic 编程之自定义 msg 1 前言和资料2 正文2.1 两种自定义 msg 方式的讨论2.2 自定义 msg 独立存在2.2.1 自定义 msg 包&#xff08;diy_interface&#xff09;2.2.2 pubsub_cpp 收发自定义 msg2.2.3 pubsub_py 收发自定义 msg 2.3 自定义 msg 放在模块包里&#xff08;p…

逻辑思维1000题丨【Exercise 1】解析

目录 声明 解析 声明 解析网上是搜不到的&#xff0c;100%原创。本专栏只会讲解重难点题目&#xff0c;简单题目不做讲解。 解析 2.What is the missing number? 1 12 13 124 15 1236 17 1248 139 12510 111 1234612 113 12714 13515 &#xff1f; 观察每个数字的末尾分别是…

Redis高并发分布锁实战

Redis高并发分布锁实战 问题场景 场景一: 没有捕获异常 // 仅仅加锁 // 读取 stock15 Boolean ret stringRedisTemplate.opsForValue().setIfAbsent("lock_key", "1"); // jedis.setnx(k,v) // TODO 业务代码 stock-- stringRedisTemplate.delete(&quo…

HarmonyOS服务卡片开发指导(Stage模型)概述

服务卡片概述 服务卡片&#xff08;以下简称“卡片”&#xff09;是一种界面展示形式&#xff0c;可以将应用的重要信息或操作前置到卡片&#xff0c;以达到服务直达、减少体验层级的目的。卡片常用于嵌入到其他应用&#xff08;当前卡片使用方只支持系统应用&#xff0c;如桌…

Android Gradle 开发与应用 (一) : Gradle基础

1. Gradle是什么 Gradle是一个通用的构建工具&#xff0c;支持诸多主要的 IDE&#xff0c;包括 Android Studio、IntelliJ IDEA、Visual Studio 等 Gradle 的底层实现(核心引擎和框架)其实是用 Java 编写的开发者通常使用 Groovy 或 Kotlin 来编写构建脚本 1.1 那么为什么Gra…

你真的了解@Async吗?

你真的了解Async吗&#xff1f; 使用场景&#xff1a; 开发中会碰到一些耗时较长或者不需要立即得到执行结果的逻辑&#xff0c;比如消息推送、商品同步等都可以使用异步方法&#xff0c;这时我们可以用到Async。但是直接使用 Async 会有风险&#xff0c;当我们没有指定线程池…

速度提高100倍 - 扩展 RAG 应用程序,以实现数十亿个嵌入,并行计算余弦相似度

原文链接&#xff1a;100x Faster — Scaling Your RAG App for Billions of Embeddings 2024 年 2 月 15 日 RAG应用程序最大的问题之一是它们的计算检索时间。想象一下&#xff0c;你有一个向量数据库&#xff0c;包含一万亿条Embedding向量的记录。当您尝试将用户查询与一…

数字化转型导师坚鹏:政府数字化转型智慧城市类案例研究

政府数字化转型智慧城市类案例研究 课程背景&#xff1a; 很多地方政府存在以下问题&#xff1a; 不清楚政府数字化转型的智慧城市类成功案例 不清楚政府数字化转型的城市大脑类成功案例 不清楚政府数字化转型的综合实践类成功案例 课程特色&#xff1a; 针对性强 …

LDRA Testbed软件静态分析_软件质量度量

系列文章目录 LDRA Testbed软件静态分析_操作指南 LDRA Testbed软件静态分析_自动提取静态分析数据生成文档 LDRA Testbed软件静态分析_Jenkins持续集成_(1)自动进行静态分析的环境搭建 LDRA Testbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果 LDRA Testb…

LeetCode--代码详解 236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先 题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&am…

python 循环语句 while 循环

while循环 Python 编程中 while 语句用于循环执行程序&#xff0c;即在某条件下&#xff0c;循环执行某段程序&#xff0c;以处理需要重复处理的相同任务。其基本形式为&#xff1a; while 判断条件(condition)&#xff1a; 执行语句(statements)…… 执行语句可以是单个语句…

遥感影像目标检测:从CNN(Faster-RCNN)到Transformer(DETR)

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…

【数据结构】周末作业

1.new(struct list_head*)malloc(sizeof(struct list_head*)); if(newNULL) { printf("失败\n"); return; } new->nextprev->next; prev->nextnew; return; 2.struct list_head* pprev->next; prev->nextp->next; p->next->prevpr…