2013-10-12 19 views
1

我正在设计一个VHDL中的微控制器。我理解每个组件(ALU/Memory ...)的作用,以及如何实现它们的一些想法。我基本上想要实现冯诺依曼体系结构。VHDL中的微控制器的总线协议

但这里是我没有得到:组件如何沟通?我不知道如何设计我的巴士(巴士?)。因此,我正在寻找一个简单的总线实现和协议。

我的悬而未决的问题:

  • 它是简单的有一个公共汽车一切或分离不同类型的数据?
  • 每个组件如何知道何时“听”以及何时“写”?

重点是设计的简单性(以及因此的实施)。我不在乎速度。我想从头开始做所有事情(即没有预先制作的软核)。

我不知道在这个阶段这是否重要,但它不需要运行“真正的”编译代码,它与任何现有的任何兼容。另外,我在哪一点上开始考虑我的'集会'指示?我认为我会直接将它们加载到内存中。

谢谢你的帮助。

编辑: 我结束了从Picoblaze绘制(很多)灵感,因为它是:

  • 简单易懂
  • 一个BSD许可证下

具体,我开始在其中添加一些说明。

回答

2

由于你主要关心的是关于微控制器设计的知识,所以一个好的方法可以看看一些早期的微处理器模型。就拿Z80:

Z80 Memory and I/O

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

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

如果没有多个外设,则不需要全部使用16条地址线(某些Z80具有8位I/O空间)。每个外设都将通过这个空间中的一些地址进行访问。例如,在一个非常简单的系统:

  • 定时器外设可以使用的地址从00H到03H
  • 一个UART可以从08H地址0FH

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

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

  1. FETCH:读程序存储器中的指令
  2. DECODE:说明书内检查特定位,并决定它是什么类型的指令
  3. EXECUTE:走该指令要求的动作(例如,ALU操作)
  4. MEMORY:对于一些指令,你需要做一个数据的读出或写入
  5. 回写:更新受新指令值的CPU寄存器

A Typical Microprocessor Datapath

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

你的大部分处理各个指令的工作将在DECODE完成和执行级。至于数据路径控制,您需要一个状态机来控制5个阶段的操作顺序。这个功能块通常称为控制单元。在这里你有几个选择:

  1. 你的状态机可以顺序,一次一个地执行所有的阶段。一条指令需要几个时钟周期才能执行。
  2. 与上面的选择类似,但如果您想使事情变得更简单,更快,则可以在单个周期中组合两个或更多个阶段。
  3. 管道指令的执行。这可以提供很大的速度提升,但是稍后可能会更好,因为事情会变得相当复杂。

至于实施,我建议保持功能模块作为独立的实体,与确保你写一个测试平台为每个块。如果您编写这些测试平台,您的工作将会更快。

至于块,注册文件很容易编码。如果您对指令布局和操作码有清晰的了解,指令解码器也很容易。如果您知道需要执行的操作,ALU也很容易。

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

+0

+1你钉住了我的担忧:)我不完全理解你的答案,但认为,但这是一个确定的进展。我在第一个示意图上看到两条总线,我该怎么弄错?另外,谁控制数据路径(CPU?)的顺序执行?你如何确保正确的开始(重置?)?另外,你有什么建议先开始实施? – nha

+0

编辑答案解决这些问题(@nha),并希望让事情更清晰 – rick

+0

它更清晰:)我可能会发布后续问题的实际实施。 – nha

0

基本上片上总线将使用并行总线进行地址和数据输入和输出。通常会有某种仲裁器决定允许哪些组件写入总线。所以一种常用的方法是:

  • 想要写入的组件将会将连接到仲裁器的数据线设置为高或低,表示它想要访问总线。
  • 仲裁器决定谁可以访问总线
  • 仲裁器设置下一个应该允许访问总线的组件的芯片选择。

通常你的片上总线将使用主/从概念,所以只有主设备才能访问总线。从站仅等待主站的请求。

我是一个像AMBA AHB/APB设计的人,但这对于您的应用程序来说可能会略微超出一点。你可以看看这个book寻找关于如何实现你的总线的想法