VHDL中微控制器的总线协议

时间:2013-10-12 15:00:39

标签: vhdl microcontroller fpga bus

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

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

我未解决的问题:

  • 为所有事情设置一条总线或分离不同类型的数据是否更简单?
  • 每个组件如何知道何时“收听”以及何时“写”?

重点在于设计的简单性(以及实施的简单性)。我不关心速度。我想从头开始做任何事情(即没有预制的软核)。

我不知道这在现阶段是否重要,但它不需要运行“真正的”编译代码,与现有的任何东西都有任何兼容性。此外,我在哪个时候开始考虑我的“装配”说明?我认为我会将它们直接加载到内存中。

感谢您的帮助。

编辑: 我最终从Picoblaze中抽取了很多灵感,因为它是:

  • 简单易懂
  • 根据BSD许可

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

2 个答案:

答案 0 :(得分:2)

由于您的主要关注点似乎是了解微控制器设计,因此一种好的方法可能是研究一些早期的微处理器模型。以Z80为例:

Z80 Memory and I/O

为了回答您的第一个问题(单个与多个总线),该芯片使用单个总线处理所有内容,并且设计非常简单。你可以使用类似的东西。为了使术语清楚,单个系统总线可以由子总线组成(它们也称为总线)。该图显示了由双向数据总线(8位宽)和地址总线(16位宽)组成的系统总线。

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

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

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

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

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

  1. FETCH:从程序存储器读取指令
  2. DECODE:检查指令中的特定位,并确定它是什么类型的指令
  3. 执行:执行指令所需的操作(例如,ALU操作)
  4. MEMORY:对于某些说明,您需要进行数据读取或写入
  5. WRITE BACK:使用受指令
  6. 影响的新值更新CPU寄存器

    A Typical Microprocessor Datapath

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

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

    1. 你的状态机可以顺序地逐步攻击所有阶段,一次一个。一条指令需要几个时钟周期才能执行。
    2. 与上面的选择类似,但如果你想让事情变得更简单和更快,那么在一个周期中组合两个或更多个阶段。
    3. 管道执行指令。这可以提高速度,但也许最好留待以后因为事情会变得非常复杂。
    4. 至于实现,我建议将功能块保持为单独的实体,确保为每个块编写测试平台。如果你编写这些测试平台,你的工作会更快。

      对于块,寄存器文件很容易编码。如果您清楚地了解指令布局和操作码,指令解码器也很容易。如果你知道它需要执行的操作,ALU也很容易。

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

答案 1 :(得分:0)

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

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

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

我喜欢AMBA AHB / APB设计,但对于您的应用来说,这可能有点过头了。您可以查看此book,了解有关如何实施总线的建议