通过上篇文章对cpu的大致认识,就可以开始RTL设计,这次设计不会细致的讲解,希望大家可以自己看书学习,强烈推荐的一本书。通过计组书的学习,不仅你会理解cpu的架构,也会对系统化的设计有更深层次的认识。本次设计为存储器的设计
**

寄存器堆设计

**
端口声明如下

 input          clk                       ;input          rst_n                     ;input  [4:0]   read_reg1                 ;input  [4:0]   read_reg2                 ;input  [4:0]   write_reg                 ;input  [31:0]  write_data                ;input          regwrite                  ;output  reg [31:0] read_data1            ;output  reg [31:0] read_data2            ;

时钟采用50Mhz,根据指令将rd1,rd2的数据通过read_data1、read_data2输出,当regwrite为1,表示有数据写入,将数据写入目标寄存器。这里写入数据采用了在时钟下降沿写入,可以有效避免结构冒险刚开始写并没有采用此方法,虽然仿真正确,但在板级验证产生错误。代码如下

always@(negedge clk or negedge rst_n)if(!rst_n)beginx0       <=       32'd0   ;x1       <=       32'd0   ;x2       <=       32'd0   ;x3       <=       32'd0   ;x4       <=       32'd0   ;x5       <=       32'd1   ;x6       <=       32'd2   ;x7       <=       32'd0   ;x8       <=       32'd0   ;x9       <=       32'd0   ;x10      <=       32'd5   ;x11      <=       32'd0   ;x12      <=       32'd0   ;x13      <=       32'd0   ;x14      <=       32'd0   ;x15      <=       32'd0   ;x16      <=       32'd0   ;x17      <=       32'd0   ;x18      <=       32'd0   ;x19      <=       32'd0   ;x20      <=       32'd0   ;x21      <=       32'd0   ;x22      <=       32'd0   ;x23      <=       32'd0   ;x24      <=       32'd0   ;x25      <=       32'd0   ;x26      <=       32'd0   ;x27      <=       32'd0   ;x28      <=       32'd0   ;x29      <=       32'd0   ;x30      <=       32'd0   ;x31      <=       32'd0   ;endelse if(regwrite)begincase(write_reg)5'd0        :      x0       <=       'd0   ;5'd1        :      x1       <=       write_data   ;5'd2        :      x2       <=       write_data   ;5'd3        :      x3       <=       write_data   ;5'd4        :      x4       <=       write_data   ;5'd5        :      x5       <=       write_data   ;5'd6        :      x6       <=       write_data   ;5'd7        :      x7       <=       write_data   ;5'd8        :      x8       <=       write_data   ;5'd9        :      x9       <=       write_data   ;5'd10       :      x10      <=       write_data   ;5'd11       :      x11      <=       write_data   ;5'd12       :      x12      <=       write_data   ;5'd13       :      x13      <=       write_data   ;5'd14       :      x14      <=       write_data   ;5'd15       :      x15      <=       write_data   ;5'd16       :      x16      <=       write_data   ;5'd17       :      x17      <=       write_data   ;5'd18       :      x18      <=       write_data   ;5'd19       :      x19      <=       write_data   ;5'd20       :      x20      <=       write_data   ;5'd21       :      x21      <=       write_data   ;5'd22       :      x22      <=       write_data   ;5'd23       :      x23      <=       write_data   ;5'd24       :      x24      <=       write_data   ;5'd25       :      x25      <=       write_data   ;5'd26       :      x26      <=       write_data   ;5'd27       :      x27      <=       write_data   ;5'd28       :      x28      <=       write_data   ;5'd29       :      x29      <=       write_data   ;5'd30       :      x30      <=       write_data   ;5'd31       :      x31      <=       write_data   ;endcase                            endalways@(*)if(!rst_n)read_data1 = 32'd0;else begincase(read_reg1)5'd0        :      read_data1      =     x0     ;5'd1        :      read_data1      =     x1     ;5'd2        :      read_data1      =     x2     ;5'd3        :      read_data1      =     x3     ;5'd4        :      read_data1      =     x4     ;5'd5        :      read_data1      =     x5     ;5'd6        :      read_data1      =     x6     ;5'd7        :      read_data1      =     x7     ;5'd8        :      read_data1      =     x8     ;5'd9        :      read_data1      =     x9     ;5'd10       :      read_data1      =     x10    ;5'd11       :      read_data1      =     x11    ;5'd12       :      read_data1      =     x12    ;5'd13       :      read_data1      =     x13    ;5'd14       :      read_data1      =     x14    ;5'd15       :      read_data1      =     x15    ;5'd16       :      read_data1      =     x16    ;5'd17       :      read_data1      =     x17    ;5'd18       :      read_data1      =     x18    ;5'd19       :      read_data1      =     x19    ;5'd20       :      read_data1      =     x20    ;5'd21       :      read_data1      =     x21    ;5'd22       :      read_data1      =     x22    ;5'd23       :      read_data1      =     x23    ;5'd24       :      read_data1      =     x24    ;5'd25       :      read_data1      =     x25    ;5'd26       :      read_data1      =     x26    ;5'd27       :      read_data1      =     x27    ;5'd28       :      read_data1      =     x28    ;5'd29       :      read_data1      =     x29    ;5'd30       :      read_data1      =     x30    ;5'd31       :      read_data1      =     x31    ;default     :      read_data1      =     x0     ;endcaseendalways@(*)if(!rst_n)read_data2 = 32'd0;else begincase(read_reg2)5'd0        :      read_data2      =     x0     ;5'd1        :      read_data2      =     x1     ;5'd2        :      read_data2      =     x2     ;5'd3        :      read_data2      =     x3     ;5'd4        :      read_data2      =     x4     ;5'd5        :      read_data2      =     x5     ;5'd6        :      read_data2      =     x6     ;5'd7        :      read_data2      =     x7     ;5'd8        :      read_data2      =     x8     ;5'd9        :      read_data2      =     x9     ;5'd10       :      read_data2      =     x10    ;5'd11       :      read_data2      =     x11    ;5'd12       :      read_data2      =     x12    ;5'd13       :      read_data2      =     x13    ;5'd14       :      read_data2      =     x14    ;5'd15       :      read_data2      =     x15    ;5'd16       :      read_data2      =     x16    ;5'd17       :      read_data2      =     x17    ;5'd18       :      read_data2      =     x18    ;5'd19       :      read_data2      =     x19    ;5'd20       :      read_data2      =     x20    ;5'd21       :      read_data2      =     x21    ;5'd22       :      read_data2      =     x22    ;5'd23       :      read_data2      =     x23    ;5'd24       :      read_data2      =     x24    ;5'd25       :      read_data2      =     x25    ;5'd26       :      read_data2      =     x26    ;5'd27       :      read_data2      =     x27    ;5'd28       :      read_data2      =     x28    ;5'd29       :      read_data2      =     x29    ;5'd30       :      read_data2      =     x30    ;5'd31       :      read_data2      =     x31    ;default     :      read_data2      =     x0     ;endcaseend

这里仅供参考,可以采用二维数组的方法,更加简便。

指令存储器设计

指令存储器用于存储运行的指令,可以使用rom来设计。端口声明如下

module instruction(address   ,rst_n     ,a1        ,a2         ,a3         ,a4         ,b1         ,b2         ,b3         ,b4         ,end_flag  ,ins   );input  [31:0] address;input         rst_n;output reg [31:0] ins;
//====================array===================
input [11:0]    a1      ;
input [11:0]    a2      ;
input [11:0]    a3      ;
input [11:0]    a4      ;
input [11:0]    b1      ;
input [11:0]    b2      ;
input [11:0]    b3      ;
input [11:0]    b4      ;
output reg   end_flag;always@(*)if(!rst_n)beginins ='d0;end_flag = 'd0;endelse  begin  //mul funct3 000改为001case(address)'d0    :  ins = 32'b000000000000_00000_110_01010_0010011;       //ori x10,x0,0  #array c'd4    :  ins = 32'b000000010000_00000_110_01011_0010011;       //ori x11,x0,16  #a'd8    :  ins = 32'b000000100000_00000_110_01100_0010011;       //ori x12,x0,32  #b//#c'd12    :  ins = 32'b000000000000_00000_110_11111_0010011;      //ori x31,x0,0'd16    :  ins = 32'b0000000_11111_00000_010_00000_0100011;     //sw x31,0(x0)'d20    :  ins = 32'b000000000000_00000_110_11111_0010011;      //ori x31,x0,0'd24    :  ins = 32'b0000000_11111_00000_010_00100_0100011;       //sw x31,4(x0)'d28    :  ins = 32'b000000000000_00000_110_11111_0010011;       //ori x31,x0,0'd32    :  ins = 32'b0000000_11111_00000_010_01000_0100011;        //sw x31,8(x0)'d36    :  ins = 32'b000000000000_00000_110_11111_0010011;        //ori x31,x0,0'd40    :  ins = 32'b0000000_11111_00000_010_01100_0100011;        //sw x31,12(x0)//#a'd44    :  ins = {a4,20'b00000_110_11111_0010011};      //ori x31,x0,106'd48    :  ins = 32'b0000000_11111_00000_010_10000_0100011;      //sw x31,16(x0)'d52    :  ins = {a3,20'b00000_110_11111_0010011};    //ori x31,x0,1'd56    :  ins = 32'b0000000_11111_00000_010_10100_0100011;      //sw x31,20(x0)'d60    :  ins = {a2,20'b00000_110_11111_0010011};     //ori x31,x0,2'd64    :  ins = 32'b0000000_11111_00000_010_11000_0100011;      //sw x31,24(x0)'d68    :  ins = {a1,20'b00000_110_11111_0010011};     //ori x31,x0,3'd72    :  ins = 32'b0000000_11111_00000_010_11100_0100011;     //sw x31,28(x0)////#b'd76    :  ins = {b4,20'b00000_110_11111_0010011};     //ori x31,x0,4'd80    :  ins = 32'b0000001_11111_00000_010_00000_0100011;      //sw x31,32(x0)'d84    :  ins = {b3,20'b00000_110_11111_0010011};    //ori x31,x0,5'd88    :  ins = 32'b0000001_11111_00000_010_00100_0100011;      //sw x31,36(x0)'d92    :  ins = {b2,20'b00000_110_11111_0010011};      //ori x31,x0,6'd96    :  ins = 32'b0000001_11111_00000_010_01000_0100011;      //sw x31,40(x0)'d100    :  ins = {b1,20'b00000_110_11111_0010011};     //ori x31,x0,7'd104    :  ins = 32'b0000001_11111_00000_010_01100_0100011;      //sw x31,44(x0)//mm: 'd108    :  ins = 32'b000000000010_00000_110_11100_0010011;     //  li x28,2  ori x28,x0,2'd112    :  ins = 32'b000000000000_00000_110_00101_0010011;     //  li x5,0    ori x5,x0,0//L1:'d116    :  ins = 32'b000000000000_00000_110_00110_0010011;       //  li x6,0   ori x6,x0,0//L2:'d120    :  ins = 32'b000000000000_00000_110_00111_0010011;     //  li x7,0      ori x7,x0,0'd124   :  ins = 32'b000000000001_00101_001_11110_0010011;   //  slli x30,x5,1'd128   :  ins = 32'b0000000_00110_11110_000_11110_0110011;  //  add  x30,x30,x6'd132   :  ins = 32'b000000000010_11110_001_11110_0010011;       //  slli x30,x30,2'd136   :  ins = 32'b0000000_11110_01010_000_11110_0110011;       //  add x30,x10,x30'd140    :  ins = 32'b000000000000_11110_010_01111_0000011;    //  lw  x15,0(x30)//L3:'d144    :  ins = 32'b000000000001_00111_001_11101_0010011;        //   slli   x29,x7,1       'd148   :  ins = 32'b0000000_00110_11101_000_11101_0110011;       //   add    x29,x29,x6     'd152    :  ins = 32'b000000000010_11101_001_11101_0010011;         //   slli   x29,x29,2      'd156   :  ins = 32'b0000000_01100_11101_000_11101_0110011;        //   add    x29,x12,x29    'd160    :  ins = 32'b000000000000_11101_010_10000_0000011;       //   lw     x16,0(x29)     'd164    :  ins = 32'b000000000001_00101_001_11101_0010011;         //   slli   x29,x5,1       'd168   :  ins = 32'b0000000_11101_00111_000_11101_0110011;        //   add    x29,x29,x7     'd172    :  ins = 32'b000000000010_11101_001_11101_0010011;         //   slli   x29,x29,2      'd176   :  ins = 32'b0000000_01011_11101_000_11101_0110011;        //   add    x29,x11,x29    'd180    :  ins = 32'b000000000000_11101_010_10001_0000011;       //   lw     x17,0(x29)     'd184   :  ins = 32'b0000001_10000_10001_001_10000_0110011;        //   mul    x16, x16, x17  'd188   :  ins = 32'b0000000_01111_10000_000_01111_0110011;      //   add    x15, x15, x16  'd192      :  ins = 32'b000000000001_00111_000_00111_0010011;       //   addi   x7,x7,1        'd196   :  ins = 32'b1111111_11100_00111_110_00111_1100111;          //   bltu   x7,x28,L3-26   pc = pc-52 = 144      'd200   :  ins = 32'b0000000_01111_11110_010_00000_0100011;   //   sw     x15,0(x30)     'd204   :  ins = 32'b000000000001_00110_000_00110_0010011;     //   addi   x6,x6,1        'd208    :  ins = 32'b1111110_11100_00110_110_10101_1100111;         //   bltu   x6,x28,L2 -44 ,pc = pc-88 =120      'd212     :  ins = 32'b000000000001_00101_000_00101_0010011;    //   addi   x5,x5,1        'd216    :  ins = 32'b1111110_11100_00101_110_01111_1100111;         //   bltu   x5,x28,L1 -50 pc= pc-100 = 116  'd220    :end_flag = 1'b1;default :  ins = 32'd0;endcaseendendmodule
/*                                                                        //#a'd44    :  ins = 32'b000001101010_00000_110_11111_0010011;      //ori x31,x0,106'd48    :  ins = 32'b0000000_11111_00000_010_10000_0100011;      //sw x31,16(x0)'d52    :  ins = 32'b000000000001_00000_110_11111_0010011;    //ori x31,x0,1'd56    :  ins = 32'b0000000_11111_00000_010_10100_0100011;      //sw x31,20(x0)'d60    :  ins = 32'b000000000010_00000_110_11111_0010011;     //ori x31,x0,2'd64    :  ins = 32'b0000000_11111_00000_010_11000_0100011;      //sw x31,24(x0)'d68    :  ins = 32'b000000000011_00000_110_11111_0010011;     //ori x31,x0,3'd72    :  ins = 32'b0000000_11111_00000_010_11100_0100011;     //sw x31,28(x0)////#b'd76    :  ins = 32'b000000000100_00000_110_11111_0010011;     //ori x31,x0,4'd80    :  ins = 32'b0000001_11111_00000_010_00000_0100011;      //sw x31,32(x0)'d84    :  ins = 32'b000000000101_00000_110_11111_0010011;    //ori x31,x0,5'd88    :  ins = 32'b0000001_11111_00000_010_00100_0100011;      //sw x31,36(x0)'d92    :  ins = 32'b0000000000110_00000_110_11111_0010011;      //ori x31,x0,6'd96    :  ins = 32'b0000001_11111_00000_010_01000_0100011;      //sw x31,40(x0)'d100    :  ins = 32'b0000000000111_00000_110_11111_0010011;     //ori x31,x0,7'd104    :  ins = 32'b0000001_11111_00000_010_01100_0100011;      //sw x31,44(x0)
*/
/*
//===========================a b ============================//#a'd44    :  ins = {a4,20'b00000_110_11111_0010011};      //ori x31,x0,106'd48    :  ins = 32'b0000000_11111_00000_010_10000_0100011;      //sw x31,16(x0)'d52    :  ins = {a3,20'b00000_110_11111_0010011};    //ori x31,x0,1'd56    :  ins = 32'b0000000_11111_00000_010_10100_0100011;      //sw x31,20(x0)'d60    :  ins = {a2,20'b00000_110_11111_0010011};     //ori x31,x0,2'd64    :  ins = 32'b0000000_11111_00000_010_11000_0100011;      //sw x31,24(x0)'d68    :  ins = {a1,20'b00000_110_11111_0010011};     //ori x31,x0,3'd72    :  ins = 32'b0000000_11111_00000_010_11100_0100011;     //sw x31,28(x0)////#b'd76    :  ins = {b4,20'b00000_110_11111_0010011};     //ori x31,x0,4'd80    :  ins = 32'b0000001_11111_00000_010_00000_0100011;      //sw x31,32(x0)'d84    :  ins = {b3,20'b00000_110_11111_0010011};    //ori x31,x0,5'd88    :  ins = 32'b0000001_11111_00000_010_00100_0100011;      //sw x31,36(x0)'d92    :  ins = {b2,20'b00000_110_11111_0010011};      //ori x31,x0,6'd96    :  ins = 32'b0000001_11111_00000_010_01000_0100011;      //sw x31,40(x0)'d100    :  ins = {b1,20'b00000_110_11111_0010011};     //ori x31,x0,7'd104    :  ins = 32'b0000001_11111_00000_010_01100_0100011;      //sw x31,44(x0)*//*'d0    :  ins = 32'b000000000000_00000_110_01010_0010011;       //ori x10,x0,0  #array c'd4    :  ins = 32'b000000010000_00000_110_01011_0010011;       //ori x11,x0,16  #a'd8    :  ins = 32'b000000100000_00000_110_01100_0010011;       //ori x12,x0,32  #b//#c'd12    :  ins = 32'b000000000000_00000_110_11111_0010011;      //ori x31,x0,0'd16    :  ins = 32'b0000000_11111_00000_010_00000_0100011;     //sw x31,0(x0)'d20    :  ins = 32'b000000000000_00000_110_11111_0010011;      //ori x31,x0,0'd24    :  ins = 32'b0000000_11111_00000_010_00100_0100011;       //sw x31,4(x0)'d28    :  ins = 32'b000000000000_00000_110_11111_0010011;       //ori x31,x0,0'd32    :  ins = 32'b0000000_11111_00000_010_01000_0100011;        //sw x31,8(x0)'d36    :  ins = 32'b000000000000_00000_110_11111_0010011;        //ori x31,x0,0'd40    :  ins = 32'b0000000_11111_00000_010_01100_0100011;        //sw x31,12(x0)'d44    :  ins = 32'b000001101010_00000_110_11111_0010011;      //ori x31,x0,106'd48    :  ins = 32'b0000000_11111_00000_010_10000_0100011;      //sw x31,16(x0)'d52    :  ins = 32'b000000000001_00000_110_11111_0010011;    //ori x31,x0,1'd56    :  ins = 32'b0000000_11111_00000_010_10100_0100011;      //sw x31,20(x0)'d60    :  ins = 32'b000000000010_00000_110_11111_0010011;     //ori x31,x0,2'd64    :  ins = 32'b0000000_11111_00000_010_11000_0100011;      //sw x31,24(x0)'d68    :  ins = 32'b000000000011_00000_110_11111_0010011;     //ori x31,x0,3'd72    :  ins = 32'b0000000_11111_00000_010_11100_0100011;     //sw x31,28(x0)////#b'd76    :  ins = 32'b000000000100_00000_110_11111_0010011;     //ori x31,x0,4'd80    :  ins = 32'b0000001_11111_00000_010_00000_0100011;      //sw x31,32(x0)'d84    :  ins = 32'b000000000101_00000_110_11111_0010011;    //ori x31,x0,5'd88    :  ins = 32'b0000001_11111_00000_010_00100_0100011;      //sw x31,36(x0)'d92    :  ins = 32'b0000000000110_00000_110_11111_0010011;      //ori x31,x0,6'd96    :  ins = 32'b0000001_11111_00000_010_01000_0100011;      //sw x31,40(x0)'d100    :  ins = 32'b0000000000111_00000_110_11111_0010011;     //ori x31,x0,7'd104    :  ins = 32'b0000001_11111_00000_010_01100_0100011;      //sw x31,44(x0)//mm: 'd108    :  ins = 32'b000000000010_00000_110_11100_0010011;     //  li x28,2  ori x28,x0,2'd112    :  ins = 32'b000000000000_00000_110_00101_0010011;     //  li x5,0    ori x5,x0,0//L1:'d116    :  ins = 32'b000000000000_00000_110_00110_0010011;       //  li x6,0   ori x6,x0,0//L2:'d120    :  ins = 32'b000000000000_00000_110_00111_0010011;     //  li x7,0      ori x7,x0,0'd124   :  ins = 32'b000000000001_00101_001_11110_0010011;   //  slli x30,x5,1'd128   :  ins = 32'b0000000_00110_11110_000_11110_0110011;  //  add  x30,x30,x6'd132   :  ins = 32'b000000000010_11110_001_11110_0010011;       //  slli x30,x30,2'd136   :  ins = 32'b0000000_11110_01010_000_11110_0110011;       //  add x30,x10,x30'd140    :  ins = 32'b000000000000_11110_010_01111_0000011;    //  lw  x15,0(x30)//L3:'d144    :  ins = 32'b000000000001_00111_001_11101_0010011;        //   slli   x29,x7,1       'd148   :  ins = 32'b0000000_00110_11101_000_11101_0110011;       //   add    x29,x29,x6     'd152    :  ins = 32'b000000000010_11101_001_11101_0010011;         //   slli   x29,x29,2      'd156   :  ins = 32'b0000000_01100_11101_000_11101_0110011;        //   add    x29,x12,x29    'd160    :  ins = 32'b000000000000_11101_010_10000_0000011;       //   lw     x16,0(x29)     'd164    :  ins = 32'b000000000001_00101_001_11101_0010011;         //   slli   x29,x5,1       'd168   :  ins = 32'b0000000_11101_00111_000_11101_0110011;        //   add    x29,x29,x7     'd172    :  ins = 32'b000000000010_11101_001_11101_0010011;         //   slli   x29,x29,2      'd176   :  ins = 32'b0000000_01011_11101_000_11101_0110011;        //   add    x29,x11,x29    'd180    :  ins = 32'b000000000000_11101_010_10001_0000011;       //   lw     x17,0(x29)     'd184   :  ins = 32'b0000001_10000_10001_001_10000_0110011;        //   mul    x16, x16, x17  'd188   :  ins = 32'b0000000_01111_10000_000_01111_0110011;      //   add    x15, x15, x16  'd192     :  ins = 32'b000000000001_00111_000_00111_0010011;       //   addi   x7,x7,1        'd196   :  ins = 32'b1111111_11100_00111_110_00111_1100111;          //   bltu   x7,x28,L3-26   pc = pc-52 = 144      'd200   :  ins = 32'b0000000_01111_11110_010_00000_0100011;   //   sw     x15,0(x30)     'd204   :  ins = 32'b000000000001_00110_000_00110_0010011;     //   addi   x6,x6,1        'd208    :  ins = 32'b1111110_11100_00110_110_10101_1100111;         //   bltu   x6,x28,L2 -44 ,pc = pc-88 =120      'd212     :  ins = 32'b000000000001_00101_000_00101_0010011;    //   addi   x5,x5,1        'd216    :  ins = 32'b1111110_11100_00101_110_01111_1100111;         //   bltu   x5,x28,L1 -50 pc= pc-100 = 116  'd220    :end_flag = 1'b1;*/

这里运行的是一个根据串口接受到两个矩阵的数据,然后进行运算,在模块外我放置了最初的指令,大家可以进行更改。

数据存储器设计

 input                       clk               ;input                       rst_n             ;input        [31:0]         address           ;input        [31:0]         write_data        ;input                       memwrite          ;input                       memread           ;output  reg [31:0]          read_data         ;

数据存储器的设计与寄存器堆设计类似,当memread信号为高,根据地址读取数据,当memwrite为高时根据地址写入数据,在这里存储数据也采用了下降沿存储,和寄存器设计当时遇到了同样的问题这里不再解释。代码如下

data_mem(clk               ,rst_n             ,address           ,write_data        ,memwrite          ,memread           ,read_data         //con               ,//uart_data         ,    //con_in);input  clk;input                       rst_n             ;input        [31:0]         address           ;input        [31:0]         write_data        ;input                       memwrite          ;input                       memread           ;output  reg [31:0]          read_data         ;// input con_in;//input [3:0] con;// output reg [31:0] uart_data;reg    [31:0]   m1         ;reg    [31:0]   m2         ;reg    [31:0]   m3         ;reg    [31:0]   m4         ;reg    [31:0]   m5         ;reg    [31:0]   m6         ;reg    [31:0]   m7         ;reg    [31:0]   m8         ;reg    [31:0]   m9         ;reg    [31:0]   m10        ;reg    [31:0]   m11        ;reg    [31:0]   m12        ;reg    [31:0]   m13        ;reg    [31:0]   m14        ;reg    [31:0]   m15        ;always@(negedge clk or negedge rst_n) if(!rst_n)beginm1       <= 'd0;m2       <= 'd0;m3       <= 'd0;m4       <= 'd0;m5       <= 'd0;m6       <= 'd0;m7       <= 'd0;m8       <= 'd0;m9       <= 'd0;m10      <= 'd0;m11      <= 'd0;m12      <= 'd0;m13      <= 'd0;m14      <= 'd0;m15      <= 'd0;endelse beginif(memwrite == 1)case(address)'d0       :      m1         <=  write_data ;'d4       :      m2         <=  write_data ;'d8       :      m3         <=  write_data ;'d12      :      m4         <=  write_data ;'d16      :      m5         <=  write_data ;'d20      :      m6         <=  write_data ;'d24      :      m7         <=  write_data ;'d28      :      m8         <=  write_data ;'d32      :      m9         <=  write_data ;'d36      :      m10        <=  write_data ;'d40      :      m11        <=  write_data ;'d44      :      m12        <=  write_data ;'d48      :      m13        <=  write_data ;'d52      :      m14        <=  write_data ;'d56      :      m15        <=  write_data ;default: beginm1       <= m1 ;m2       <= m2 ;m3       <= m3 ;m4       <= m4 ;m5       <= m5 ;m6       <= m6 ;m7       <= m7 ;m8       <= m8 ;m9       <= m9 ;m10      <= m10;m11      <= m11;m12      <= m12;m13      <= m13;m14      <= m14;m15      <= m15;endendcaseendalways@(*)if(!rst_n)read_data = 'd0;else begin  if(memread == 1)case(address)'d0     :     read_data =    m1       ;'d4     :     read_data =    m2       ;'d8     :     read_data =    m3       ;'d12    :     read_data =    m4       ;'d16    :     read_data =    m5       ;'d20    :     read_data =    m6       ;'d24    :     read_data =    m7       ;'d28    :     read_data =    m8       ;'d32    :     read_data =    m9       ;'d36    :     read_data =    m10      ;'d40    :     read_data =    m11      ;'d44    :     read_data =    m12      ;'d48    :     read_data =    m13      ;'d52    :     read_data =    m14      ;'d56    :     read_data =    m15      ;default :     read_data =    'd0      ;endcaseendendmodule
 cpu中相关存储的设计就到此结束了。

基于FPGA的RISC_V五级流水设计---存储设计相关推荐

  1. m基于FPGA的积分梳状CIC滤波器verilog设计

    目录 1.算法描述 2.仿真效果预览 3.verilog核心程序 4.完整FPGA 1.算法描述 积分梳状滤波器,是指该滤波器的冲激响应具有如下形式: 其物理框图如图所示: 可见,CIC滤波器是由两部 ...

  2. 基于FPGA的以太网控制器(MAC)设计(下)

    今天给大侠带来基于FPGA的以太网控制器(MAC)设计,由于篇幅较长,分三篇.今天带来第三篇,下篇,程序的仿真与测试和总结.话不多说,上货. 导读 当前,互联网已经极大地改变了我们的生产和生活.与之相 ...

  3. 电子技术课程设计基于FPGA的音乐硬件演奏电路的设计与实现

    wx供重浩:创享日记 对话框发送:乐曲电路 免费获取完整无水印论文报告(包含电路图) 文章目录 一.设计任务要求 二.总体框图 三.选择器件 四.功能模块 五.总体设计电路图 六.结束语 一.设计任务 ...

  4. 电机控制器,FPGA 硬件电流环 基于FPGA的永磁同步伺服控制系统的设计

    电机控制器,FPGA 硬件电流环 基于FPGA的永磁同步伺服控制系统的设计,在FPGA实现了伺服电机的矢量控制. 有坐标变换,电流环,速度环,位置环,电机反馈接口,SVPWM. Verilog ID: ...

  5. 基于FPGA的以太网控制器(MAC)设计(中)

    今天给大侠带来基于FPGA的以太网控制器(MAC)设计,由于篇幅较长,分三篇.今天带来第二篇,中篇,以太网控制器(MAC)程序的实现.话不多说,上货. 导读 当前,互联网已经极大地改变了我们的生产和生 ...

  6. 基于FPGA的永磁同步伺服控制系统的设计,在FPGA实现了伺服电机的矢量控制

    基于FPGA的永磁同步伺服控制系统的设计,在FPGA实现了伺服电机的矢量控制, 坐标变换,电流环,速度环,位置环,电机反馈接口,SVPWM. . . 都是通过Verilog 语言来实现的,具有很高的研 ...

  7. 基于FPGA的永磁同步伺服控制系统的设计,在FPGA实现了伺服电机的矢量控制, 坐标变换,电流环,速度环,位置环,电机反馈接口,SVPWM 都是通过Verilog 语言来实现的

    基于FPGA的永磁同步伺服控制系统的设计,在FPGA实现了伺服电机的矢量控制, 坐标变换,电流环,速度环,位置环,电机反馈接口,SVPWM. . . 都是通过Verilog 语言来实现的,具有很高的研 ...

  8. 基于FPGA的永磁同步伺服控制系统的设计,在FPGA实现了伺服电机的矢量控制, 坐标变换,电流环,速度环

    基于FPGA的永磁同步伺服控制系统的设计,在FPGA实现了伺服电机的矢量控制, 坐标变换,电流环,速度环,位置环,电机反馈接口,SVPWM 都是通过Verilog 语言来实现的 FPGA 硬件电流环 ...

  9. FPGA 硬件电流环 基于FPGA的永磁同步伺服控制系统的设计

    FPGA 硬件电流环 基于FPGA的永磁同步伺服控制系统的设计,在FPGA实现了伺服电机的矢量控制. 有坐标变换,电流环,速度环,位置环,电机反馈接口,SVPWM. Verilog 编号:841000 ...

最新文章

  1. [BZOJ 2002][Hnoi2010]Bounce 弹飞绵羊(分块)
  2. cocos2d-js 3.0 RC0 监听返回键、菜单键、进入后台(home键)、恢复显示等事件
  3. java集合转字符串拼接_关于集合和字符串的互转实现方法
  4. Android中selector的使用
  5. Windows 2003 主域控和DNS迁移到Windows 2008 R2(2)
  6. 如何使用计算机中的导出,如何将iPhone手机中的音乐导出至电脑
  7. linux 快捷matlab_ubuntu下Matlab_Linux添加工具包操作步骤
  8. python比较两个列表不同部分_Python实现比较两个列表(list)范围
  9. 国庆假期程序员是这样给自己粉饰无限的逼格!
  10. 简单的java程序设计原则和模式
  11. OpenCV学习笔记05--ROI和WidthStep的运用
  12. Pico Neo3 4VR游戏下载地址及十大好玩游戏推荐
  13. 电子发票撤销 java_已确认的发票如何撤销
  14. gatk过滤_VCF文件中的原始突变过滤–filter raw variants in vcf
  15. 输入中文转换成拼音首字母
  16. uboot启动流程详解
  17. 2022-2028年全球与中国SCADA石油和天然气行业发展趋势及投资战略分析
  18. 餐饮连锁店远程视频监控系统设计需求分析
  19. NLP常见语言模型及数据增强方法总结
  20. 麒麟信安操作系统推动智慧电力高质发展

热门文章

  1. 病毒不可怕,就怕流氓有文化
  2. 21. 理解CNI和CNI插件
  3. 那些年啊 那些事 一个程序员的奋斗史 121
  4. 【PV操作】买面包的叫号算法(存疑)
  5. Android发送消息的核心代码,Android 抖音 发消息Call 调用 实现群发消息 代码hook源码...
  6. 2022-10-11(一、远程命令执行和系统命令执行)
  7. listen1在火狐浏览器安装的步骤和细节处理
  8. Android相机资源占用,为保护用户隐私Android 11调整相机选项 APP调用相机时只可使用默认相机...
  9. 如何使用python-docx第三方库,操作读写doc Word文档,快速制作数据报表
  10. 微信 服务器 多开 不需要手机,实用:手把手教你不用手机号就可以完美注册微信!...