MoCha

FLASH源码 2025-08-12

MoCha

M iCrocontroller f o r c computer arc Itecture A tion( MoCha )是Niit University开发的8位微控制器。针对教学目的,具有完全合成的VHDL代码,所有单个组件的测试台,汇编器和一个循环精确的模拟器。

该文档简要概述了设计,然后进行了一些细节和用法。具体文档及其链接如下:

  • 设计文档,包含在开发过程中做出的设计决策。
  • 汇编手册,包含有关汇编器的各种功能和用法的信息。
  • 模拟器手册,包含有关模拟器的各种功能和用法的信息。

内容

  1. 概述
  2. 特征
    2.1内存布局
    2.2步进电动机外围
    2.3 SPI闪存控制器
    2.4汇编器
    2.5模拟器
  3. 用法
    3.1引导过程
    3.2合成
    3.3加载用户程序

1。概述

该设计最初是由RN Biswas教授设计的,用于NIIT大学的计算机组织和建筑课程,在他离开大学之前,该设计仅在2011年的2011年迭代中使用。此后,该设计一直没有使用。在桑杰·古普塔(Sanjay Gupta)教授的密切监督下,作者对设计进行了重大更改,并在可编程的门阵列(FPGA)上进行了合成。此外,已经添加了基本的软件支持,以使其适合在计算机组织和体系结构以及微处理器和微控制器的课程中使用。

原始设计的添加如下:

  1. 银行寄存器和MVB ,将总内存从256B增加到64kb。
  2. 内存映射的I/O ,以提供与环境交互的能力。
  3. 步进电动机外围,所有当前微控制器都没有特征。
  4. SPI Flash接口,为存储持续数据提供支持。
  5. 可以编译用户程序和引导加载程序的汇编程序(差异以及引导过程已在启动过程部分中说明)。
  6. 模拟器,不仅简化了教学,还简化了调试过程。

图1和2分别显示了MoCha的框图和指令集体系结构(ISA)。如图1所示,它是基于累加器的公共汽车体系结构。尽管有指令可以执行注册到注册操作,但所有结果始终首先最终出现在累加器中。循环的数量在指令之间差异很大,对于JPP而言,NO-OP的循环低至7个周期。

图1:<span class = Mocha框图“样式=”最大宽度:100%;“>
图1:框图
图2:<span class = Mocha isa“ style =”最大宽度:100%;”>
图2:指令集体系结构

我们在Numato Mimas V2 Spartan 6 FPGA板上合成了设计。我们的实现达到了62MHz的最大时钟速度。目前,该设计最多支持16 I/O端口,其中8个保留。有关内存映射的更多信息,请参见“内存布局”部分。

2。功能

本节详细介绍了MoCha的某些功能和设计细节。

2.1内存布局

即使MoCha是8位设计,它也可以解决64KB的内存。这意味着所有需要持有地址的寄存器,即内存地址寄存器(MAR)程序计数器(PC)堆栈指针(SP) ,均为16位。虽然累加器(AR)也是负载和存储说明的地址来源,但并未使其宽16位。取而代之的是,添加了另一个称为银行寄存器(BR)的寄存器,该寄存器提供了地址的较高订单字节。登记册的命名是为了介绍和解释内存库的概念。

图3:内存映射
图3:内存映射

图3显示了MoCha的内存布局。如图所示,内存的最后32个字节是为I/O保留的。端口7的端口保留给I/O和外围设备。其余端口可用于添加更多外围设备或作为GPIO。我们的实施将端口8、9和10用作GPIO,而其余的未使用。可以通过编辑文件memory_unit.vhd and controller.vhd来轻松地重新映射它们。

2.2步进电动机外围

步进电动机外围是MoCha的独特特征,因为它在任何其他微控制器中都不存在。它只是四个I/O端口和计时器的组合。外围设备具有四个可配置的选项:速度,步骤,方向和启用。

  • I/O端口3-速度(5位) :可以将电动机配置为以32个不同的速度运行,0是最快的,最慢的31。
  • I/O端口4-步骤(8位) :电动机可以运行256个步骤。
  • I/O端口5-方向(1位) :用于配置旋转方向。
  • I/O端口6-启用(1位) :这是主启用位。必须将其设置为0以配置上述选项并将设置为1以运行电动机。

2.3 SPI闪存控制器

SPI控制器允许用户与闪存交互。尽管可以用于任何其他目的,但引导加载程序假定它可以连接到包含用户程序的闪存。它已经以某种方式实施,即为此目的没有专用的硬件(除了I/O端口),并且所有处理都是由软件完成的。图4显示了协议7的端口7的位。

图4:SPI控制器端口映射
图4:SPI控制器端口映射

提供了四个用于使用控制器的装配功能:

  • SPI_RESET_AND_ENABLE :重置设备并使其能够开始接受命令。
  • SPI_WRITE_BYTE :将单个字节写入SPI端口。
  • SPI_READ_BYTE :从SPI端口读取单个字节。
  • Spi_disable :禁用对设备的访问。

有关每个功能和用法示例的更多信息,请参见引导加载程序。

2.4汇编器

请参阅此文件。

2.5模拟器

请参阅此文件。

3。用法

本节详细说明了以下内容:

  1. 微控制器的引导过程
  2. 有关如何将设计合成到FPGA上的详细信息
  3. 将程序加载到微控制器上

3.1引导过程

为了使设计在运行的软件方面尽可能灵活,MicroController具有用于教学设计的看似复杂的启动过程。引导序列如下:

  1. 从微序列内存的地址0开始执行的微码开始执行。该代码将所有寄存器重置为0,并加载PC和SP的初始值。假定值按以下顺序存储在RAM中:

    • 地址0: SP [15:8]
    • 地址1: SP [7:0]
    • 地址2: PC [15:8]
    • 地址3: PC [7:0]
  2. 加载的PC值可以立即指向用户程序。但是,这意味着要使用户加载他/她的程序,他/她将不得不将其用于RAM中并每次生成新的二进制文件。事实证明,这是一个非常耗时的过程。在我们的实施中,加载PC指向的程序实际上是引导加载程序。引导加载程序将存储在SPI闪存中的用户程序加载到微控制器的主内存中。引导加载程序的大小为201个字节。因此,从地址202开始将用户程序加载到RAM中。汇编器适当地在二进制中取消PC。

    引导加载程序对用户二进制进行了一些假设,如下所述:

    • 字节中的程序大小已添加到用户程序中,即二进制的前两个字节应包含随后的程序的大小。这允许引导程序事先知道从ROM到RAM复制的字节数。
    • 二进制文件存储在ROM中,从地址0x0f0000开始。
  3. 最后,一旦复制了程序,启动加载程序就会跳到第一个指令并开始执行。

上述启动序列的优点是可以生成单个FPGA二进制文件以运行不同的程序。用户可以简单地将其程序加载到ROM中,然后打开微控制器。有关加载用户程序的更多信息,请参见“加载用户程序”部分。

3.2合成

为了合成微控制器,作者使用Xilinx ISE 14.7来生成Xilinx Spartan-6 XC6SLX9 FPGA的位文件。本节介绍了相同的合成过程。

  1. 此存储库中的hdl目录包含所有HDL源和测试台。将所有源文件加载到项目中。使controller.vhd成为该项目的顶级模块。

  2. 使用块内存生成器生成主内存。在组件名称main_ram下的文件memory_unit.vhd中查找模块规格。需要使用Bootloader初始化此内存,可以使用在目录ipcore_dir目录中找到的COE文件main_ram.coe来完成。

  3. 同样,分别使用control_unit.vhd中的规格生成解码器和微序列存储器,分别以decoder_rammp_ram名称生成。它们相应的COE文件也可以在目录ipcore_dir中找到。

  4. 使用controller.vhd中指定的端口编写用户构成文件。如果使用Numato Mimas V2 Spartan-6 FPGA板,则可能需要在目录ucf中使用作者的UCF文件。

  5. 最后,建立项目。如果一切顺利,您应该在项目目录中有一个controller.bit

3.3加载用户程序

安装Xilinx ISE 14.7时,还安装了一种称为promgen的工具。该工具可方便地用于组合FPGA的位文件和用户二进制文件。将二进制文件加载到FPGA上:

  1. 使用提供的汇编器生成程序的二进制文件。

  2. controller.bit和您的二进制文件与目录loader中的文件相同的目录中,即目录应包含五个文件。

  3. 运行脚本comb_bin并将二进制的名称传递为第一个参数。 Windows用户需要运行comb_bin.bat ,而Linux用户将需要运行comb_bin.sh

  4. 最后,运行脚本MimasV2Config.py ,将FPGA的端口号作为第一个参数,然后下载。bin作为第二个参数。

你完成了! FPGA现在应该启动您的程序。要加载其他程序,请将新文件放在上述目录中,然后使用新的二进制名称重复步骤3和4。

下载源码

通过命令行克隆项目:

git clone https://github.com/Sacusa/MoCha.git