
这包含使用Verilog硬件描述语言(VHDL)的微处理器和中央处理器(CPU)的实现。 现场可编程门阵列(FPGA)包含可以进行编程以执行任务的逻辑组件。 我们使用Quartus II 10.0和ModelSim-Altera 6.5e设计并仿真了微处理器和CPU。 我们已经在基于Altera-DE02 FPGA的评估板上测试了设计的性能。
如何制作能够对图像进行过滤和下采样的CPU和微处理器。
我们创建的CPU应该通过串行输入获取图像数据,并将数据保存在主存储器中,然后再执行过滤任务和下采样任务。 之后,CPU应通过串行连接返回已处理的数据。 可以通过将其划分为几个子任务来完成大任务。
- 控制输入数据信号并将其存储在主存储器中。
该任务由FPGA中的通用异步收发器(UART)实现来完成。 数据应使用串行数据传输软件发送到UART端口。 UART可以使用FPGA中的Verilog实现。 接收到应存储在FPGA中已实现的主存储器中的数据之后。 - 过滤存储的图像
在此任务中,我们对图像进行滤波以去除高频分量。 否则,高频成分可能会产生混叠,并且在下一个任务(下采样图像)中会出现问题。 该任务通过使用FPGA中的高斯滤波器实现来完成。 稍后在此博客文章中介绍该算法。 对处理的数据进行下采样后,将其存储在相同的主内存中。 在这里,我们使用了256 X 256灰度图像作为输入。 - 对过滤后的图像进行下采样
在过滤过程之后,该数据将进入下采样过程,然后存储在相同的主内存中以有效地使用该内存。 - 控制输出数据并显示下采样的图像
下采样图像的数据应发送到基于FPGA的已实现UART端口,并使用串行通信软件(或MATLAB)进行收集。
指令集架构(ISA)
任务是过滤和下采样256 X 256图像。 为此,我们必须
至少要处理65536个像素,这意味着我们需要65536个存储位置来存储数据。 为了实现该目标,已经完成了以下规范。
- DRAM —数据RAM
DRAM具有65536个存储单元,每个存储单元的宽度为8位。 这些存储位置用于存储图像的像素值。 - IRAM —指令RAM
指令RAM也是8位宽,有256个。其中包含要执行的指令。 基本上,是用于对图像进行过滤和下采样的算法的汇编代码。 - 红外—指令寄存器
指令寄存器为8位宽,它存储从IRAM中提取的指令。 - PC —程序计数器
这是16位宽,并且将下一条指令的地址保留在要执行的IRAM中。 - AR —地址寄存器
它提供数据寄存器的地址,它是16位宽。 - R1,R2,R3,R4,R5
这些是通用寄存器,所有五个寄存器均为16位宽。 - AC —蓄电池
累加器为16位宽,可以直接访问ALU。 当我们从内存中加载数据时,会将其加载到AC中。 当我们要将数据存储到数据存储器中时,它也从AC中存储。 - ALU —算术和逻辑单元
16位用于执行七个不同的操作。 - 控制单元
它根据指令寄存器(IR)给出的指令生成所有控制信号。 - 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 2 1]的内核来获取三个垂直相邻像素的平均值。 然后我们存储值。 为了优化内存,我们使用包含图像像素值的相同内存(覆盖值)。

2. 计算水平高斯

3. 下采样

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