【FPGA】基于FPGA的极简CPU设计 |
您所在的位置:网站首页 › fpga逻辑设计 › 【FPGA】基于FPGA的极简CPU设计 |
本人私人博客:Megalomania,大部分文章会现在博客上传,有不足之处欢迎指正。 这个是我这个学期FPGA的期末大作业,老师说是给两周的时间去写,其实还是在最后一周匆匆赶制出来的 不到DDL不开工。其实吧,要我自己评价是挺不满意的,主要是结构缩水了太多,为了节省代码量,我们甚至连PC指针砍掉,并且将ALU和Control Unit强行拼在了一起,变成了一个单地址指令结构的(严格来说应该也算不上)CPU。可能唯一的优点就是执行快吧… 设计原理
输入信号为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 |