CPU设计实战-Wishbone总线接口

为什么需要改用总线接口?

1.但是在实际应用中,程序的体积可能非常大,指令存储器就不能再集成在FPGA内部了,一般使用FPGA芯片外部的Flash作为指令存储器。同理,-般使用FPGA芯片外部的SDRAM作为数据存储器

2.统一接口标准。 很多ip都是买的,需要统一的标准。 2. 功能增减很容易如果要增加新的master或slave,那么新增加一组总线接口就行了。 3. 减少互联线整个系统干净整洁、接口清晰。

Wishbone总线接口定义

需要注意的是:

WE读写使能信号:低位表示读操作,高位表示写操作

SEL数据总线选择信号:用于选择总线上哪些bit是有效的,宽度为位宽/总线粒度(一般为一个字节)

CYC总线周期信号:代表总线正在被占用(不一定是总线操作),在总线使用时须持续有效

STB总线选用信号:有效时代表发起一次总线操作

在发起一次总线操作后,这两个信号都要有效

ACK操作结束信号:操作结束给一个有效位

总线单次读写操作过程

单次读

1.主设备:

WE置低表示读操作,STB和CYC有效表示发起一次总线操作,发送地址ADR和选通信号SEL

2.从设备:

传输数据给主设备,ACK响应信号置高表示传输完成,

3.主设备:

发现ACK高后接收数据,拉低CYC和STB表示总线操作完成

4.从设备:

发现STB低后,拉低ACK信号

单次写操作

1.主设备:

WE置高表示写操作,STB和CYC有效表示发起一次总线操作,发送地址ADR、选通信号SEL、数据DATA

2.从设备:

锁存主设备的数据,ACK响应信号置高表示传输完成

3.主设备:

发现ACK高后接收数据,拉低CYC和STB表示总线操作完成

4.从设备:

发现STB低后,拉低ACK信号

选通信号SEL与数据DATA的关系

取指访存阶段信号改写

本质上是对存储器进行读写,需要注意因为程序放在flash上,数据再SDRAM上,读写需要两个时钟周期,所以取指和访存需要两个时钟周期,在读写未完成时要把流水线进行暂停。暂停在CTRL控制模块中实现。

内部具体实现

使用有限状态机

一共分为三种状态,初始,忙碌和暂停;

当开始使用总线(CE)时,转移到忙碌状态,当访问结束(接收到ACK),转移到空闲状态

需要考虑流水线暂停与异常发生,修改如下:

当开始使用总线(CE)且不处于异常状态时,转移到忙碌状态

当访问结束(接收到ACK)且没有流水线暂停情况,转移到空闲状态;如果有转移到暂停状态:

当暂停结束时,暂停状态才跳转到初始状态

CTRL模块实现

    end else if(stallreq_from_if == `Stop) beginstall <= 6'b000111;flush <= 1'b0;		

按照之前定义的信号,取指阶段暂停应该是stall赋值为000011,这里为什么是000111?

这是考虑一种特殊情况即延迟槽指令必须执行,试想一下当前指令是转移指令,那么下一条指令就是延迟槽指令,如果只是取指阶段暂停而译码阶段暂停(也就是插入空指令),那么就会把空指令当做延迟槽指令。

所以我们需要将译码阶段和取指一起暂停,保持同步。

总线的通信方式

共享总线

由仲裁器控制总线的占有权,但同一时刻只能有一对主从设备通信

交叉互联

主从设备交叉连接,允许同一时刻多对主从设备通信

交叉互联模块实现

主设备根据地址高四位选择从设备,此处使用的IP最多支持8个主设备16个从设备,

故寻址空间大小2^8=256M,寻址空间0x0-0xFFFFFFF,按照如下接口定义分配地址空间:
 

可以看到指令存储在FLASH中,地址从0x30000000开始,故要修改PC在初始情况的地址:

		if (ce == `ChipDisable) beginpc <= 32'h30000000;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯 2023 省B 飞机降落

首先&#xff0c;这题要求的数据量比较少&#xff0c;我们可以考虑考虑暴力解法。 这题可能难在很多情况的考虑&#xff0c;比如说&#xff1a; 现在时间是10&#xff0c;有个飞机20才到&#xff0c;我们是可以干等10分钟。 #include <iostream> #include <…

0101插入排序-算法基础-算法导论第三版

文章目录 一 插入排序二 循环不变式与插入排序的正确性三 伪代码中的一些约定四 Java代码实现插入排序结语 一 插入排序 输入&#xff1a; n n n个数订单一个序列 ( a 1 , a 2 , ⋯ , a n ) (a_1,a_2,\cdots,a_n) (a1​,a2​,⋯,an​). **输出&#xff1a;**输入序列的一个排…

OpenWRT+zeroTier旁路由组网

前言 我之前写过一篇文章&#xff0c;探究了zeroTier的最基础的玩法&#xff0c;那篇文章结尾我提到了使用zeroTier虽然实现组网了&#xff0c;但是我只能访问局域网中制定的设备&#xff0c;局域网中其他设备无法访问&#xff0c;这篇文章我又研究了一套方案openwrtzeroTier旁…

IEEE Transactions on Medical Imaging(TMI)论文推荐:2024年01月(1)

Unsupervised Domain Adaptation for Medical Image Segmentation by Disentanglement Learning and Self-Training 摘要&#xff1a;无监督域适应(Unsupervised domain adaptive, UDA)旨在提高深度模型在无标记数据上的分割性能&#xff0c;近年来受到广泛关注。在本文中&…

el-input设置max、min无效的解决方案

目录 一、方式1&#xff1a;type“number” 二、方式2&#xff1a;oninput&#xff08;推荐&#xff09; 三、计算属性 如下表所示&#xff0c;下面为官方关于max&#xff0c;min的介绍&#xff1a; el-input&#xff1a; max原生属性&#xff0c;设置最大值min原生属性&a…

如何在 Linux ubuntu 系统上搭建 Java web 程序的运行环境

如何在 Linux ubuntu 系统上搭建 Java web 程序的运行环境 基于包管理器进行安装 Linux 会把一些软件包放到对应的服务器上&#xff0c;通过包管理器这样的程序&#xff0c;来把这些软件包给下载安装 ubuntu系统上的包管理器是 apt centos系统上的包管理器 yum 注&#xff1a;…

前缀和算法

前缀和可以快速求出数组中某个连续区间的和 预处理出来一个前缀和数组 为了处理边界情况,下标从1开始 dp[i]表示原数组[ 1 , i ]区间内所有元素之和 dp[i]dp[i-1]原数组[i] 使用前缀和数组 文章目录 【模板】前缀和【模板】二维前缀和寻找数组的中心下标除自身以外数组的乘积…

打卡学习kubernetes——了解k8s基本概念

目录 1 Container 2 Pod 3 Node 4 Namespace 5 Service 6 Label 7 Annotations 8 Volume 1 Container Container(容器)是一种便携式、轻量级的操作系统级虚拟化技术。它使用namespace隔离不同的软件运行环境&#xff0c;并通过镜像自包含软件的运行环境&#xff0c;从而…

关于继承是怎么样的?那当然是很好理解之

本文描述了关于继承的大部分知识&#xff0c;但是并不全&#xff0c;每篇博客之间的知识都有互串&#xff0c;所以需要把几篇文章合起来看&#xff0c;学会融会贯通&#xff01; 温馨提示&#xff1a;使用PC端观看&#xff0c;效果更佳&#xff01; 目录 1.继承是什么 2.什…

机器学习是什么?

机器学习是一种人工智能&#xff08;AI&#xff09;的分支&#xff0c;其主要目标是使计算机系统能够通过数据和经验来改进和学习&#xff0c;而无需明确地编程。在机器学习中&#xff0c;计算机系统会通过对大量数据进行学习和分析&#xff0c;从中发现模式和规律&#xff0c;…

JavaScript进阶:js的一些学习笔记-4

文章目录 1. 拷贝1. 浅拷贝2. 深拷贝 2. 异常处理 1. 拷贝 这里指的拷贝是指拷贝引用类型的数据(对象) 1. 浅拷贝 拷贝对象&#xff1a;Object.assign() 或者 {…obj} 展开运算符 const obj {name:liuze,age:23 } const o {...obj}; o.age 22; console.log(o); console.…

Linux | Ubuntu安装pylsl

PYNQ开发中使用pylsl过程记录 操作系统为 Linux pynq 5.15.19-xilinx-v2022.1 #1 SMP PREEMPT Mon Apr 11 17:52:14 UTC 2022 armv7l armv7l armv7l GNU/Linux 使用 pip install pylsl 安装后在导入包的过程中会遇到如下错误&#xff1a; RuntimeError: LSL binary library f…

深入浅出前端本地储存(1)

引言 2021 年&#xff0c;如果你的前端应用&#xff0c;需要在浏览器上保存数据&#xff0c;有三个主流方案&#xff1a; CookieWeb Storage (LocalStorage)IndexedDB 这些方案就是如今应用最广、浏览器兼容性最高的三种前端储存方案 今天这篇文章就聊一聊这三种方案的历史…

前端基础篇-深入了解 Ajax 、Axios

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Ajax 概述 2.0 Axios 概述 3.0 综合案例 1.0 Ajax 概述 通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据。异步交互是指&#xff0c;可以在不…

【安全类书籍-2】Web渗透测试:使用Kali Linux

目录 内容简介 作用 下载地址 内容简介 书籍的主要内容是指导读者如何运用Kali Linux这一专业的渗透测试平台对Web应用程序进行全面的安全测试。作者们从攻击者的视角出发,详细阐述了渗透测试的基本概念和技术,以及如何配置Kali Linux以适应渗透测试需求。书中不仅教授读者…

[zdyz]FreeRTOS笔记

FreeRTOS基础知识 1&#xff0c;任务调度器简介 调度器就是使用相关的调度算法来决定当前需要执行的哪个任务 抢占式调度 时间片调度 协程式调度 略 2&#xff0c;任务状态 运行态 正在执行的任务&#xff0c;该任务就处于运行态&#xff0c;注意在STM32中&#xff0c;同…

【JAVA】Servlet开发

目录 HttpServlet HttpServletRequest HttpServletResponse 错误页面 设置网页自动刷新时间 构造重定向相应 js发起http请求 服务器端对js发起的http请求进行处理 前端获取后端数据&#xff0c;添加到当前页面的末尾&#xff0c;代码示例&#xff1a; 前后端交互&…

Linux环境(Ubuntu)上搭建MQTT服务器(EMQX )

目录 概述 1 认识EMQX 1.1 EMQX 简介 1.2 EMQX 版本类型 2 Ubuntu搭建EMQX 平台 2.1 下载和安装 2.1.1 下载 2.1.2 安装 2.2 查看运行端口 3 运行Dashboard 管理控制台 3.1 查看Ubuntu上的防火墙 3.2 运行Dashboard 管理控制台 概述 本文主要介绍EMQX 的一些内容&a…

深入解析C++树形关联式容器:map、set及其衍生容器的使用与原理

文章目录 一、引言二、关联式容器的中的 paira.pair 的创建及使用b.pair 间的比较 三、 map 与 set 详解1. map 的基本操作2. set 的基本操作3.关联式容器的迭代器 四、 multimap 与 multiset 的特性五、关联式容器的使用技巧与注意事项1. 键值类型的选择与设计2. 自定义比较函…

SVN修改已提交版本的注释

目录 一、需求分析 二、问题分析 三、解决办法 一、需求分析 ​开发过程中&#xff0c;在SVN提交文件后&#xff0c;发现注释写的不完整或不够明确&#xff0c;想再修改之前的注释文字​。 使用环境&#xff1a; SVN服务器操作系统&#xff1a;Ubuntu 20.04.6 LTS SVN版本&…