我正在用VHDL设计一个微控制器。我正处于理解每个组件的角色(ALU / Memory ...)以及如何实现它们的一些想法。我基本上想要实现Von Neumann架构。
但这是我没有得到的:组件如何沟通?我不知道如何设计我的公共汽车(公共汽车?)。因此,我正在寻找一种简单的总线实现和协议。
我未解决的问题:
重点在于设计的简单性(以及实施的简单性)。我不关心速度。我想从头开始做任何事情(即没有预制的软核)。
我不知道这在现阶段是否重要,但它不需要运行“真正的”编译代码,与现有的任何东西都有任何兼容性。此外,我在哪个时候开始考虑我的“装配”说明?我认为我会将它们直接加载到内存中。
感谢您的帮助。
编辑: 我最终从Picoblaze中抽取了很多灵感,因为它是:
具体来说,我首先添加了一些说明。
答案 0 :(得分:2)
由于您的主要关注点似乎是了解微控制器设计,因此一种好的方法可能是研究一些早期的微处理器模型。以Z80为例:
为了回答您的第一个问题(单个与多个总线),该芯片使用单个总线处理所有内容,并且设计非常简单。你可以使用类似的东西。为了使术语清楚,单个系统总线可以由子总线组成(它们也称为总线)。该图显示了由双向数据总线(8位宽)和地址总线(16位宽)组成的系统总线。
回答你的第二个问题(组件如何知道它们何时活动), 在上图中,您可以看到两个不同的信号,即内存请求和I / O请求。一次只有一个处于活动状态,并且当I / O请求处于活动状态时,可能会访问外围设备。
如果没有很多外设,则不需要使用全部16个地址线(某些Z80具有8位I / O空间)。可以通过此空间中的某些地址访问每个外围设备。例如,在一个非常简单的系统中:
在这个简单的例子中,你需要提供两个电路:一个将检测地址何时在00-03h范围内,另一个将检测08-0Fh。如果在每个检测器的输出和I / O请求信号之间执行逻辑“和”,那么您将有两个信号指示何时访问每个外设。您的外围硬件应该主要听取此信号。
最后,关于有关说明的问题,微处理器内部的数据流将分为几个阶段。这通常称为处理器的数据路径。通常将阶段划分为:
来源:https://www.cs.umd.edu/class/fall2001/cmsc411/projects/DLX/proj.html
处理个别指令的大部分工作都将在DECODE和EXECUTE阶段完成。至于数据路径控制,您将需要一个状态机来控制5个阶段的操作顺序。该功能块通常称为控制单元。在这里你有几个选择:
至于实现,我建议将功能块保持为单独的实体,确保为每个块编写测试平台。如果你编写这些测试平台,你的工作会更快。
对于块,寄存器文件很容易编码。如果您清楚地了解指令布局和操作码,指令解码器也很容易。如果你知道它需要执行的操作,ALU也很容易。
我首先编写指令解码器和寄存器文件的测试平台。然后我会写一个运行所有测试平台的脚本并自动检查它们的结果。只有这样,我才会专注于功能块本身的实现。
答案 1 :(得分:0)
基本上,片上总线将使用并行总线进行地址和数据输入和输出。通常会有某种仲裁器决定允许哪个组件写入总线。所以一个常见的方法是:
通常,您的片上总线将使用主/从概念,因此只有主设备才能访问总线。奴隶只等待主人的请求。
我喜欢AMBA AHB / APB设计,但对于您的应用来说,这可能有点过头了。您可以查看此book,了解有关如何实施总线的建议