基于FPGA的处理器实现

这包含使用Verilog硬件描述语言(VHDL)的微处理器和中央处理器(CPU)的实现。 现场可编程门阵列(FPGA)包含可以进行编程以执行任务的逻辑组件。 我们使用Quartus II 10.0和ModelSim-Altera 6.5e设计并仿真了微处理器和CPU。 我们已经在基于Altera-DE02 FPGA的评估板上测试了设计的性能。

如何制作能够对图像进行过滤和下采样的CPU和微处理器。

我们创建的CPU应该通过串行输入获取图像数据,并将数据保存在主存储器中,然后再执行过滤任务和下采样任务。 之后,CPU应通过串行连接返回已处理的数据。 可以通过将其划分为几个子任务来完成大任务。

  1. 控制输入​​数据信号并将其存储在主存储器中。
    该任务由FPGA中的通用异步收发器(UART)实现来完成。 数据应使用串行数据传输软件发送到UART端口。 UART可以使用FPGA中的Verilog实现。 接收到应存储在FPGA中已实现的主存储器中的数据之后。
  2. 过滤存储的图像
    在此任务中,我们对图像进行滤波以去除高频分量。 否则,高频成分可能会产生混叠,并且在下一个任务(下采样图像)中会出现问题。 该任务通过使用FPGA中的高斯滤波器实现来完成。 稍后在此博客文章中介绍该算法。 对处理的数据进行下采样后,将其存储在相同的主内存中。 在这里,我们使用了256 X 256灰度图像作为输入。
  3. 对过滤后的图像进行下采样
    在过滤过程之后,该数据将进入下采样过程,然后存储在相同的主内存中以有效地使用该内存。
  4. 控制输出数据并显示下采样的图像
    下采样图像的数据应发送到基于FPGA的已实现UART端口,并使用串行通信软件(或MATLAB)进行收集。

指令集架构(ISA)

任务是过滤和下采样256 X 256图像。 为此,我们必须
至少要处理65536个像素,这意味着我们需要65536个存储位置来存储数据。 为了实现该目标,已经完成了以下规范。

  1. DRAM —数据RAM
    DRAM具有65536个存储单元,每个存储单元的宽度为8位。 这些存储位置用于存储图像的像素值。
  2. IRAM —指令RAM
    指令RAM也是8位宽,有256个。其中包含要执行的指令。 基本上,是用于对图像进行过滤和下采样的算法的汇编代码。
  3. 红外—指令寄存器
    指令寄存器为8位宽,它存储从IRAM中提取的指令。
  4. PC —程序计数器
    这是16位宽,并且将下一条指令的地址保留在要执行的IRAM中。
  5. AR —地址寄存器
    它提供数据寄存器的地址,它是16位宽。
  6. R1,R2,R3,R4,R5
    这些是通用寄存器,所有五个寄存器均为16位宽。
  7. AC —蓄电池
    累加器为16位宽,可以直接访问ALU。 当我们从内存中加载数据时,会将其加载到AC中。 当我们要将数据存储到数据存储器中时,它也从AC中存储。
  8. ALU —算术和逻辑单元
    16位用于执行七个不同的操作。
  9. 控制单元
    它根据指令寄存器(IR)给出的指令生成所有控制信号。
  10. A,B和C巴士
    所有三个总线均为16位,并且输入和输出到ALU。

指令系统

处理器由8位指令组成。 下表给出了我们使用的指令集。 后4位用于标识操作,前4位用于为MOVEAC,SUB和ADD操作提供附加信息。

指令的前4位用于指定寄存器。 这里的alpha表示指定的寄存器

·R1 = 0001

·R2 = 0010

·R3 = 0011

·R4 = 0100

·R5 = 0101

·AR = 0110(地址寄存器)

·AC = 0111(累加器)

·IR = 1000(指令寄存器)

·PC = 1001(程序计数器)

模组

不加注册

将更大的内存中的数据加载到寄存器中,这些数据将用于算术运算并由机器指令进行操作或测试。 寄存器在处理周期中临时存储数据。 寄存器为16位宽。 存储的数据始终在Dout处可用,并且已连接到多路复用器。 因此,它可以选择应将哪些数据写入总线。 没有增量标志。 因此,如果存储的数据需要递增,则必须转到ALU进行递增操作,然后写回寄存器。

它具有16位输入端口和16位输出端口。 当时钟上升沿的加载标志为“ 1”时,寄存器将在输入处加载数据。 Verilog代码可从https://github.com/SaviniSenla/FPGA-based-Processor-Implementation/blob/master/Register.v获得。

用增量注册

结构与无增量寄存器相同。 除了增量寄存器中的所有操作外,其中还有一个增量标志。 因此,每当我们需要将寄存器的值加1时,就不需要去ALU。 该模块可以自己完成任务。 当增量标记在时钟的上升沿为高时,寄存器将其值递增1。

该模块的Verilog代码可在以下网址获得:https://github.com/SaviniSenla/FPGA-based-Processor-Implementation/blob/master/SRegister.v

复用器

在设计架构中,所有输出均连接到单个总线。 但是一个输出可以一次将数据写入总线,因此,我们必须从所有输入中进行选择。 此实现已通过使用Multiplexer完成。 该模块的Verilog代码-https://github.com/SaviniSenla/FPGA-based-Processor-Implementation/blob/master/Mux.v

ALU

所有的算术和逻辑运算均由该模块完成。 它有两个16位的A和B总线作为输入,还有3位的输入用于选择操作。为同步起见,给ALU提供了一个时钟作为输入。 有两个输出,一个是C总线,另一个是z标志。 C总线直接连接到AC寄存器,因此,ALU的任何输出仅流向AC寄存器。

z值指示ALU的输出是否为零。 该模块的Verilog代码位于https://github.com/SaviniSenla/FPGA-based-Processor-Implementation/blob/master/ALU.v

处理器

该模块包含除内存模块和与通信相关的模块之外的所有模块的实例。 它具有所有寄存器模块(R1,R2,R3,R4,R5,AR,IR),SRegister模块(AC,PC),ALU,MUX,解码器和控制单元的实例。 这是设计的CPU。 该图具有四个输入和六个输出。

输入项

·clk-时钟-给出用于同步目的的时钟。

·dram-将数据ram中的数据提供给处理器(16位)。

·pram-将指令ram中的数据提供给处理器(16位)。

·启动-这将启用处理器操作。

产出

·读取-读取使能信号至Dram(数据RAM)或Pram(指令RAM)。

·write —将启用信号写入Dram。

·acout-数据输入到Dram。

·pcout-指向婴儿车的地址。

·arout — Dram的地址。

·endp-用于指示过程结束。

该模块的Verilog代码可在以下网址获得:https://github.com/SaviniSenla/FPGA-based-Processor-Implementation/blob/master/processor.v

控制单元

所有控制信号均由本机产生。 它具有四个输入和十个输出。 所有指令都有一个或多个微指令。 在此模块中,每条指令都有一个微序列表示。 每个微序列表示为22位宽。

·STATE-当前状态

·MI —微指令

·DEC —解码器选择值

·MUX-多路复用器选择值

·OPR-在ALU中运行

·R —阅读

·W —写

·INAC —递增AC

·RAC —重设AC

·INPC —增量式PC

·RPC-重置PC

·NS —下一个状态

·X-在FETCH3中,它更改为执行所需的状态

·Y-解码器和多路复用器选择该值。 通过指令代码的前4位选择。

Verilog代码-https://github.com/SaviniSenla/FPGA-based-Processor-Implementation/blob/master/ControlUnit.v

解码器

该模块具有一个输入和九个输出。 解码器选择在ALU操作之后数据应该去的地方。 该输入是控制单元的输出。 输入可以是以下寄存器之一,输出可以使能R1,R2,R3,R4,R5,Ac,PC,IR和AR中的一个。

Verilog代码-https://github.com/SaviniSenla/FPGA-based-Processor-Implementation/blob/master/Decoder.v

D存储模块

该模块用于存储图像数据以进行图像处理。 从UART读取数据并将串行数据转换为字节后,所有数据单元均保存在dram模块中,以进行进一步的操作。 该模块有65536个存储单元,内存为8位(位宽)。 由于这里我们将灰度图像用于下采样,因此每个像素的值在0到255之间变化。因此,一个8位宽度的存储位置足以存储一个像素的值。 该模块有五个输入和一个输出。 “ Din”输入用于输入包含16位数据流的数据,“ address”给出dram必须读取或写入数据的地址值,且该地址值为16位宽。

Verilog代码-https://github.com/SaviniSenla/FPGA-based-Processor-Implementation/blob/master/DMemory.v

内存条

这是指令存储器。 这将存储所有以汇编语言编码的指令。 该模块包含要在256个存储单元中执行的指令,并且是8位宽。 存储在此内存中的汇编代码是对图像进行过滤和下采样的算法。 该模块有五个输入和一个输出。 输出是获取我们需要的数据。 Clk用于同步目的。 读是用于读取数据的使能信号,写是用于写入数据的使能信号,din是数据输入以及地址给定的存储器位置。

Verilog代码-https://github.com/SaviniSenla/FPGA-based-Processor-Implementation/blob/master/Memory.v

顶级模块

该顶部模块包含数据存储器,指令存储器,处理器,BaudGen,发送器和接收器的实例。 它以clk,start和rx作为输入,以end1,tx和s作为输出。

Verilog代码-https://github.com/SaviniSenla/FPGA-based-Processor-Implementation/blob/master/testmp.v

以下链接提供了所有模块(包括接收器模块和发射器模块)的Verilog代码–

https://github.com/SaviniSenla/FPGA-based-Processor-Implementation

滤波和下采样算法

该算法包含3个主要步骤,

  • 计算垂直高斯
  • 计算水平高斯
  • 下采样

我们使用3 * 3高斯内核进行过滤。 重量分布如上图所示。

首先,如以下代码段所示,我们将像素值分别存储在256 * 256的存储位置中。

  1. 计算垂直高斯
  • 在这里,我们使用[1 2 1]的内核来获取三个垂直相邻像素的平均值。 然后我们存储值。 为了优化内存,我们使用包含图像像素值的相同内存(覆盖值)。

2. 计算水平高斯

3. 下采样

图像应取为原始图像大小的一半(高度和宽度),此算法将从过滤后的图像中每四个像素取一个值,并将其存储在内存中。