首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一种VHDL单片机总线协议

一种VHDL单片机总线协议
EN

Stack Overflow用户
提问于 2013-10-12 15:00:39
回答 2查看 1.5K关注 0票数 2

我正在用VHDL设计一个微控制器。我正在理解每个组件(ALU/Memory.)的角色,以及如何实现它们的一些想法。我基本上想要实现Von架构。

但我不明白的是:组件是如何通信的?我不知道怎样设计我的公共汽车。因此,我正在寻找一个简单的总线实现和协议。

我尚未解决的问题:

  • 对于每件事都有一条总线,还是将不同类型的数据分开,是更简单吗?
  • 每个组件如何知道什么时候该“听”和什么时候该“写”?

重点是设计的简单性(因此也是实现的简单性)。我不在乎速度。我想从头开始做每件事。没有预先制作的软核)。

我不知道这在现阶段是否重要,但它不需要运行“真正的”编译代码,而是与现有的任何东西都有任何兼容性。另外,在什么时候我开始考虑我的“程序集”指令?我想我会把它们直接装入内存中。

谢谢你的帮助。

编辑: I最终从皮卡布莱中获得了(很多)灵感,因为它是:

  • 简单易懂
  • 根据BSD牌照

具体来说,我首先给它添加了一些说明。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-13 13:59:12

由于您主要关心的似乎是学习微控制器的设计,一个好的方法可能是看看一些早期的微处理器模型。例如,Z80:

  • 来源:http://landley.net/history/mirror/cpm/z80.html
  • 另一个很好的Z80 HW描述:http://www.msxarchive.nl/pub/msx/mirrors/msx2.com/zaks/z80prg02.htm

为了回答你的第一个问题(单总线和多总线),这个芯片使用一条总线来处理所有的事情,而且它的设计非常简单。你可能会用到类似的东西。为了明确术语,单个系统总线可以由子总线(它们也称为总线)组成。图显示由双向数据总线(8位宽)和地址总线(16位宽)组成的系统总线。

要回答您的第二个问题(组件如何知道它们何时处于活动状态),在上面的图像中,您可以看到两个不同的信号:内存请求和I/O请求。一次只有一个是活动的,当I/O请求处于活动状态时,也就是当外围设备可能被访问时。

如果你没有很多外围设备,你不需要使用所有的16个地址行(有些Z80有一个8位的I/O空间)。每个外围设备将通过这个空间中的一些地址访问。例如,在一个非常简单的系统中:

  • 计时器外设可以使用从00h到03h的地址。
  • uart的地址可以从08h到0Fh。

在这个简单的例子中,您需要提供两个电路:一个是检测地址在00-03h范围内,另一个是08-0Fh。如果在每个检测器的输出和I/O请求信号之间执行逻辑“和”,那么您将有两个信号指示何时访问每个外围设备。你的外围硬件应该主要听这个信号。

最后,关于您的指令问题,微处理器内部的数据流将有几个阶段。这通常被称为处理器的数据路径。常见的做法是将阶段划分为:

  1. 读取:从程序内存读取指令
  2. 解码:检查指令中的特定位,并决定它是什么类型的指令。
  3. 执行:执行指令所要求的操作(例如,ALU操作)
  4. 内存:对于某些说明,您需要进行数据读或写。
  5. 写回:用受指令影响的新值更新CPU寄存器

来源:https://www.cs.umd.edu/class/fall2001/cmsc411/projects/DLX/proj.html

您处理单个指令的大部分工作将在解码和执行阶段完成。至于datapath控件,您将需要一个状态机,它通过五个阶段控制操作序列。这个功能块通常称为控制单元。在这里,你有几个选择:

  1. 你的状态机可以按顺序依次运行各个阶段,一次一个。一个指令需要几个时钟周期才能执行。
  2. 类似于上面的选择,但是如果您想让事情变得更简单、更快,那么在一个周期中组合两个或多个阶段。
  3. 命令的执行过程。这可以极大地提高速度,但也许留到以后比较好,因为事情会变得相当复杂。

至于实现,我建议将函数块保持为单独的实体,并确保为每个块编写一个testbench。如果你写那些遗嘱,你的工作会进展得更快。

至于代码块,Register非常容易编写。如果您对指令布局和操作代码有一个清晰的概念,那么指令解码器也是很容易的。如果您知道ALU需要执行的操作,那么ALU也是很容易的。

首先,我会为指令解码器和寄存器文件编写测试程序。然后,我会编写一个脚本来运行所有的测试工作台,并自动检查它们的结果。只有这样,我才会专注于功能块本身的实现。

票数 2
EN

Stack Overflow用户

发布于 2013-10-12 23:09:21

基本上,片上总线将使用并行总线进行地址和数据的输入和输出.通常会有某种仲裁者来决定哪个组件被允许写入总线。因此,一个共同的方法是:

  • 要写入的组件将将连接到仲裁器的数据线设置为“高”或“低”,以表示它希望访问总线。
  • 仲裁者决定谁可以进入公共汽车。
  • 仲裁器设置应该允许在访问总线旁边的组件的芯片选择。

通常,您的片上总线将使用主从概念,因此只有主程序才能访问总线。奴隶们只等待主人的请求。

我喜欢AMBA AHB/APB的设计,但这对你的应用程序来说可能有点过头了。您可以查看这个,寻找有关如何实现总线的想法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19335583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档