下午消遣:设计你自己的微处理器

文章作者:Daniel Ogilvie

为什么不自己设计一个微处理器(或者借用这个)呢?适合所有尺寸的fpga。味道很好,更少填肚子。

在实验室的角落里,您是否看到脾气暴躁的老工程师在送新的毕业生送到商店以获得一袋洞。这可能是我,但是当人事部门成为奥威尔人的人力资源部门时,制作禁止在团队建设日禁止休假时,我决定离开就业并开始我自己的公司。自由?好吧,一种排序 - 你仍然需要生产可能销售的东西。但是你确实花了几天时间探索一些昏暗的电子设备大道,而不有营销要求你为管理层生产另一个PowerPoint演示,试图证明他们的证明启发打破基本物理定律的想法。这篇文章就是关于这样一种转移。

我喜欢读那些古怪的工程师模仿过去的微处理器(比如68000甚至是Cray)的文章。我自己最喜欢的处理器是摩托罗拉6809,在我担任工程师的早期日子里,我把它当作主力,用一台老式的Dragon家用电脑作为开发工具。我想把它设计成FPGA——只是为了好玩——这时一个更迫切的需求占据了上风。

在我的设计中,我经常使用fpga,通常需要一个处理万博投注网址器来进行一些管理或控制。虽然基于fpga的处理器是可用的,比如Altera的Nios,但它们确实使用了大量的资源,经常需要外部代码内存,因为它们受到C编译器甚至操作系统的拖累。我决定设计我自己的最小微处理器来完成像我这样的简单任务2C控制外设,或简单的控制接口,如数字编码器和字符液晶显示。松散的设计基于我的最爱,我6809年的,但很快就开始剥光,最后设法挤一个可行的处理器为小于400逻辑元素(LEs -基本上4-input查表,后跟一个可编程的触发器,fpga的构建块),让它适合fpga中最小的,或允许在同一FPGA中进行多个实例化。

处理器的框图,我称之为PT13,如图所示图1

图1PT13自制微处理器框图

我决定从6809剥离16位寄存器,尽管使用累加器B保持有限的索引操作,因为它是用于参考表的方便。这节省了至少32次。

我还删除了两个16位堆栈指针寄存器。为了保持处理器的最小足迹,我决定放弃中断。这意味着必须轮询事件,这有点浪费了力量,但由于代码相对简单,并且给出了它允许的节省 - 例如,不需要保留所有寄存器的副本 - 这是一个值得妥协的副本 - 这是一个值得妥协的.要实现子程序分支,三个寄存器形成FIFO以保持程序计数器内容,允许最多三个嵌套例程。在编程时,您需要了解此限制,因为如果您超过此数字,则没有汇编程序警告。

每个指令周期需要一个固定的16个时钟,所以在27 MHz(我通常用于PT13的时钟)下,每个指令需要大约600 ns。这似乎是一个过多的时间-确实是-但它确实使一个简单的内部状态机。每个指令周期有四个元素:获取、解码、执行和写回。我使用超过一个周期的每个元素的原因是Altera FPGA存储器的结构,这必须注册地址(或数据?它是其中之一,或者可能两者都是)。只允许有足够的时间来读取或写入内存数据更简单。

在启动时,内部状态机被重置,程序计数器(PC)被清除。然后它开始在地址$0000 (Fetch周期)处寻址程序内存。程序内存是FPGA内部的——典型的代码大小可能只有1 kB,可以在两个Altera内存块中实现(每个块是512×9位)。Altera有两种内存文件格式,HEX和MIF。汇编程序可以创建这两种文件中的任何一种,尽管我使用的是MIF文件。如果实例化一个配置为单端口ROM的内存块,并将初始文件指向汇编的二进制文件,那么每次修改处理器代码时,您所要做的就是编译FPGA,新代码将自动包含在编译中。

在第一个PC位置的数据由Op-code解码块解码,Op-code解码块反过来控制控制单元的顺序。大约有50条指令,它们被分为算术、逻辑、分支、加载和存储,以及一个令牌NOP(无操作)指令。对非法指令没有特殊处理。算术指令由A或b两个累加器上的加和减组成。条件码寄存器检测两个累加器的进位和零条件。

逻辑指令是,或,左右逻辑,逻辑和算术换档,左右旋转(通过携带)。条件分支(携带清除,携带集,零或非零),分支,分支和分支到子程序(并返回)构成分支指令。在每种情况下,绝对分支地址遵循指令,并由汇编程序计算。加载和存储说明包括立即写入累加器的说明,并加载和存储外部数据存储器的说明。

图2显示了如何连接PT13外部ROM和RAM存储器,也输入/输出(I/O)设备。RAM和I/O占用相同的地址空间。RAM只需要变量存储,因为堆栈是基于寄存器的。地址由两部分组成:上4位由数据页寄存器组成,该寄存器使用加载立即指令写入。较低的字节要么是指令后面的直接数据,要么是累加器B的内容,允许进行索引操作。

图2外部内存和I/O连接

这是如何在Verilog中实例化PT13:

PT13 PT13 (.Clock (XTAL_27M) .RESETn (RESETn) .Program_memory_data (ROM_data [7:0]), .RAM_data_out (read_data [7:0]), .ROM_A (rom_a [13:0]), .RAM_A (ram_a [11:0]), .RAM_data_in (ram_data_in [7:0]), .read_write (read_write));

程序存储器有效地使用组装的二进制文件(默认称为ars13text.mif)初始化的单个端口ROM。ROM的地址是ROM_A [13:0],读取数据是ROM_DATA [7:0]。时钟可以是你喜欢的任何东西,但应该是固定的且稳定 - 我通常有27 MHz时钟可用,所以我用它。然后,该时钟应该用于连接到PT13的其他任何内存或I / O.RESETN是异步活动低复位。RAM由Ram_A [11:0]解决。读写数据有单独的端口:要将要写入RAM的数据是RAM_DATA_IN [7:0],并且从RAM读取的数据是RAM_DATA_OUT [7:0]。READ_WRITE信号指示RAM是否被写入(低)或读取(高)。

我通常使用一个FPGA RAM块用于可变存储,即使我只使用几十个位置,因为如果我将内存实现为寄存器,它将节省所需的逻辑资源,而我通常在FPGA设计中留有内存。I/O设备使用解码的内存地址。要读回多个地址,就需要一个多路复用器。例如:

//多路读取数据到PT13

总是@ *开始

例(ram_a(很高))

8'h00: read_data = RAM_memory;

8'h09:read_data =({6'd0,sda_hdmi,scl_hdmi});

默认值:read_data = 8'd0;

终结

结尾

下面是一个I/O只写寄存器的示例,我用它来处理位操作I2C控制。I2C_control_en从Ram_A [11:0]解码(如上所示,读回来,如上所述)。

// HDMI I2C控制

总是@ (posedge XTAL_27M或negedge RESETn)开始

如果(! RESETn)开始

I2C_control_latch < = 2 'd0;

end else if (I2C_control_en) begin

i2c_control_latch <= ram_data_in [1:0];

尽头别的开始了

I2C_control_latch < = I2C_control_latch;

结尾

结尾

assign SDA_HDMI = ~I2C_control_latch[1] ?1'b0:1'bz;

分配scl_hdmi =〜i2c_control_latch [0]?1'b0:1'bz;

PT13的原始代码是用Altera的硬件描述语言(AHDL)编写的,它仍然产生最紧凑的代码,但我现在已经用Verilog重写了PT13。我做的最后一次编译使用了391个LEs。我相信它可以进一步优化,但我已经达到了目的,把时间花在赚钱的工作上更好。

虽然PT13软件可以使用任何编辑器编写,但我使用的是一种允许您添加高亮显示操作码的高亮文件的编辑器,这提高了清晰度。PT13汇编程序(as13.exe)是我的一个朋友写的,他精通软件的黑暗艺术。它在DOS系统中运行,如前所述,可以直接创建正确大小的Altera MIF文件。将汇编程序可执行文件保存在与代码相同的目录中很方便。例如,在这种情况下,组装名为PT13_code的代码。asm,你输入:

as13 -s rom=1024 PT13_code.asm . aspx

它将生成一个名为AS13Text.mif的1 KB文件。汇编程序还将在代码中报告错误。

多年来,我在许多项目中使用过PT13:用于用户界面,如LCD字符显示、数字编码器和开关的控制;如信号丢失时应如何处理;对于简单的通信,如RS-232或I2C控制一个外设。PT13作为一个完整的设计的一部分是非常有用的,因为它允许一些实时例程的简单修改。例如,视频AGC程序可以通过重新编程PT13来改变,如果遇到原始设计中没有考虑到的输入条件。这在FPGA应用中可能无关紧要,但对于ASIC设计,如果可以提供一个小的可编程ROM (ASIC内部或外部),那么就有可能在无需重新旋转整个设计的情况下修复算法。

PT13可以是教育工具 - 一种解构的覆盆子PI,您可以在那里潜入实际处理器并在愿意修改它。我设计了一个带有几个外围设备的小型电路板,例如LCD,按钮,数字编码器,IR接收器和几种数字化PMOD.端口,允许访问范围广泛的外设,匹配PT13的能力。

我使用的是现在已经很古老的Altera EP2C8 Cyclone II FPGA,它的优点是没有暴露的焊盘,所以可以用一个尖端精细的烙铁、一只稳定的手来手工组装电路板,对我来说,还可以用一台台式显微镜。该电路板使用Express PCB的免费下载软件设计,所以PCB可以以较低的成本制造(EP2C8设备只支持旧版本的Quartus软件)。

设计PT13非常有趣,与我的日常工作视频处理非常不同。好吧,现在有无数以600mhz频率运行的微处理器,可以一边给你泡茶,一边给你讲睡前故事,而这一切只需要几美元。但设计PT13就像是回到了制作自己的音频放大器或AM收音机的时代。可能有几十个项目都有“PT13 Inside”,即滚动、阅读和摆弄。我一直想回去进一步优化代码,但我似乎永远都找不到时间。或许我接下来会编写Inmos Transputer。当然只是为了好玩!

文件

所有的与PT13有关的文件和信息可供下载。

这包括PT13的AHDL和Verilog版本、编辑器和汇编器的链接、用户手册、代码示例和PCB设计文件。

也许你喜欢阅读龙电脑我在我的年轻人中使用......

相关文章


- - - - - -Daniel Ogilvie.跑A.视频处理公司并在几个大洲生活和设计过。


留下你的评论