【FPGA】基于FPGA的极简CPU设计

您所在的位置:网站首页 fpga逻辑设计 【FPGA】基于FPGA的极简CPU设计

【FPGA】基于FPGA的极简CPU设计

2023-09-14 11:43| 来源: 网络整理| 查看: 265

本人私人博客:Megalomania,大部分文章会现在博客上传,有不足之处欢迎指正。

这个是我这个学期FPGA的期末大作业,老师说是给两周的时间去写,其实还是在最后一周匆匆赶制出来的 不到DDL不开工。其实吧,要我自己评价是挺不满意的,主要是结构缩水了太多,为了节省代码量,我们甚至连PC指针砍掉,并且将ALU和Control Unit强行拼在了一起,变成了一个单地址指令结构的(严格来说应该也算不上)CPU。可能唯一的优点就是执行快吧…

设计原理

看的出来其实我们设计的这个原理十分简单,一个只剩下指令寄存器的控制单元,不用计算PC指针,还和运算单元结合在了一起,连在顶层文件中的连接都省了。由于是在家里上课,也没有上板之类的,只要ModuleSim能跑就行,所以把外围内存都删了(其实原理也挺简单的),直接看输入输出波形就完事了。但是内部的存储单元还是得要,不然有许多操作的中间值没地方放,自己写一个就行了,也不要什么IP Core之类的。

指令列表

输入信号为16位数 别问,问就是强迫症,高8位为指令码,低8位为操作数。 总共就九个指令,全部围绕寄存器A进行:

in_ram:将A中的数写入RAM,地址为输入数据低8位所指的空间load_num:从外部输入数据到Aout_ram:将RAM中的数写入A,地址为输入数据低8位所指的空间clr:清空Ainc:A中的数自加1dec:A中的数自减1stay:等待指令add:将A中的数与输入数据低8位相加min:将A中的数与输入数据低8位相减 代码设计

工程总共有4个文件:输入模块,运算控制模块,RAM模块以及顶层模块

输入模块(IDEC.v)

输入模块负责将输入的16位二进制数分割为2个8位二进制数,高8位为指令,低8位为操作数或者RAM地址。

module IDEC( clk, reset, code_in, //指令输入端口 code_addr, //操作码输出端口 data_addr //操作数输出端口 ); input clk,reset; input [15:0] code_in; output [7:0] code_addr; output [7:0] data_addr; reg [7:0] code_addr; reg [7:0] data_addr; always @(posedge clk or negedge reset) begin if(!reset) begin code_addr A inc = 8'b00000101, //A+1->A dec = 8'b00000110, //A-1->A stay = 8'b00000111, //等待指令 add = 8'b00001000, //A+in_data->A min = 8'b00001001; //A-in_data->A reg [7:0] acc; //A reg wr; //写使能端 reg rd; //读使能端 reg [7:0] addr_RAM; //RAM输入地址 wire [7:0] out_RAM; //RAM输出数据 reg fullout; //溢出位 RAM ram( .addr(addr_RAM), .din(acc), .dout(out_RAM), .wr(wr), .rd(rd) ); //对相应指令进行相应操作 always@(posedge clk ) begin case(in_code) stay:begin acc =acc; end clr:begin acc = 0;dout= acc; end inc:begin acc = acc+1;dout= acc; end dec:begin acc = acc-1;dout= acc; end load_num: begin acc = in_data; dout= acc; end in_ram: begin rd=0; wr=1; addr_RAM=in_data; dout=1; end out_ram: begin rd=1; wr=0; addr_RAM=in_data; acc = out_RAM; dout= acc; end add: begin add8(acc, in_data, acc, fullout); dout=acc; end min: begin sub8(acc, in_data, acc, fullout); dout=acc; end default: ; endcase end task add8; // 8位全加器 input [7:0] a,b; output [7:0] sum; output c_out; integer i; reg c_in; begin c_in = 0; begin for(i=0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3