【FPGA】模子机下载FPGA筹划

[复制链接]
发表于 2025-11-3 06:02:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次
  
  模子机下载FPGA筹划
  框架
  仿真
  代码
  MIOC.v
  IO.v
  SoC.v
  
  
  只是理论,下板还需做相应的修改
  
  模子机下载FPGA筹划

  
  32位MIPS地点空间接纳内存与IO同一编址方式,统共232个存储单位,每个单位默认存放1个字节,即统共4GB。分别为:用户空间和内核空间。
  (1)内核空间(0x8000_0000—0xFFFF_FFFF)2GB
  (2)用户空间(0x0000_0000—0x7FFF_FFFF)2GB
  

  框架



仿真

           instmem [0] = 32'h34011100;   //ori r1,r0,1100h         r1--32'h0000 1100
        instmem [1] = 32'h34020020;   //ori r2,r0,0020h        r2--32'h0000 0020
         instmem [2] = 32'h3403ff00;   //ori r3,r0,ff00h        r3--32'h0000 ff00
         instmem [3] = 32'h3404ffff;   //ori r4,r0,ffffh        r4--32'h0000 ffff
        //R1=00001100 R2=00000020
        instmem [4] = 32'b000000_00001_00010_00101_00000_100000;//add,R5,R1,R2  00001120
        instmem [5] = 32'b000000_00001_00010_00110_00000_100101;//or,R6,R1,R2   00001120
          //测试FPGA
        //用户空间的访问0000_0000~6FFF_FFFF
        //(r1)=0000 1100
        //    +0000 0018
        //addr=0000 1118  
        //    =1000100011000 字节地点
        //    =100 0100 0110 字地点
        //      =446H             只有1K空间 太大电脑内存不敷 实际巨细有7000_0000
        //    =46H             丢掉了高位的1位
        //    =70
        //datamem[70]=(r6)=00001120
        instmem[6]=32'b101011_00001_00110_0000_0000_0001_1000; //sw r6,0x18(r1)
        //(r7)=datamem[70]
        instmem[7]=32'b100011_00001_00111_0000_0000_0001_1000; //lw r7,0x18(r1)
        //IO空间的访问7000_0000~7FFF_FFFF
        //lui  R0,7000 --R8 --70000000
        instmem [8] = 32'h3C087000;
        //(r8)=70000000
        //    +0000 0018
        //addr=7000 0018  
        //    =0111 0000 0000 0000 0000 0000 0001 1000 字节地点
        //    =0111 0000 0000 0000 0001 0000 0001 10 字地点
        //      =1C00 0406H             只有1K空间 实际巨细有1000_0000
        //    =06H             丢掉了多余位 1K=400H
        //    =6
        //iomem[6]=(r6)=00001120
        instmem[9]=32'b101011_01000_00110_0000_0000_0001_1000; //sw r6,0x18(r8)
        //(r9)=iomem[6]
        instmem[10]=32'b100011_01000_01001_0000_0000_0001_1000; //lw r9,0x18(r8)
  


代码

MIOC.v

  1. `include "define.v"
  2. module MIOC(
  3.         input wire memCe,
  4.         input wire memWr,
  5.         input wire [31:0] memAddr,
  6.         input wire [31:0] wtData,
  7.         input wire[31:0] ramRdData,
  8.         input wire[31:0] ioRdData,
  9.         output reg[31:0] rdData,
  10.         output reg ramCe,
  11.         output reg ramWe,
  12.         output reg [31:0] ramAddr,
  13.         output reg[31:0] ramWtData,
  14.         output reg ioCe,
  15.         output reg ioWe,
  16.         output reg[31:0] ioAddr,
  17.         output reg [31:0] ioWtData
  18. );
  19.         always@(*)
  20.                 if(memCe == `RamEnable)
  21. //                        if(memAddr & 32'hF000_0000 == 32'h7000_0000) //按位与结果不对
  22.                         if(memAddr >= 32'h7000_0000 && memAddr<32'h8000_0000)
  23.                                 begin
  24.                                         ioCe= `RamEnable;
  25.                                         ioWe = memWr;
  26.                                         ioAddr = memAddr;
  27.                                         ramCe= `RamDisable;
  28.                                         ramWe = `RamUnWrite;
  29.                                         ramAddr = `Zero;
  30.                                 end
  31.                         else
  32.                                 begin
  33.                                         ioCe = `RamDisable;
  34.                                         ioWe= `RamUnWrite;
  35.                                         ioAddr = `Zero;
  36.                                         ramCe= `RamEnable;
  37.                                         ramWe = memWr;
  38.                                         ramAddr = memAddr;
  39.                                 end
  40.                 else
  41.                         begin
  42.                                 ioCe= `RamDisable;
  43.                                 ioWe= `RamUnWrite;
  44.                                 ioAddr = `Zero;
  45.                                 ramCe= `RamDisable;
  46.                                 ramWe = `RamUnWrite;
  47.                                 ramAddr = `Zero;
  48.                         end
  49.                
  50.         always@(*)
  51.                 if(memCe == `RamEnable)
  52.                         if(ramCe ==`RamEnable)
  53.                                 begin
  54.                                         rdData= ramRdData;
  55.                                         ramWtData = wtData;
  56.                                         ioWtData= `Zero;
  57.                                 end
  58.                         else
  59.                                 begin
  60.                                         rdData = ioRdData;
  61.                                         ramWtData= `Zero;
  62.                                         ioWtData=wtData;
  63.                                 end
  64.                 else
  65.                         begin
  66.                                 rdData= `Zero;
  67.                                 ramWtData= `Zero;
  68.                                 ioWtData= `Zero;
  69.                         end
  70. endmodule
复制代码
IO.v

  1. `include "define.v";
  2. module IO(
  3.         input wire ce,
  4.         input wire clk,
  5.         input wire we,
  6.         input wire[31:0]addr,
  7.         input wire[31:0]wtData,
  8.         output reg[31:0]rdData
  9.         /*IO interface*/   
  10. );
  11.         /*access IO device*/
  12.     reg [31:0] iomem [1023 : 0];
  13.     always@(*)      
  14.         if(ce == `RamDisable)
  15.           rdData = `Zero;
  16.         else
  17.           rdData = iomem[addr[11 : 2]];
  18.     always@(posedge clk)
  19.         if(ce == `RamEnable && we == `RamWrite)
  20.             iomem[addr[11 : 2]] = wtData;
  21.         else ;
  22. endmodule
复制代码
SoC.v

  1. module SoC(
  2.     input wire clk,
  3.     input wire rst
  4. );
  5.     wire [31:0] instAddr;
  6.     wire [31:0] instruction;
  7.     wire romCe;
  8.    //ls
  9.     wire memCe, memWr;   
  10.     wire [31:0] memAddr;
  11.     wire [31:0] rdData;
  12.     wire [31:0] wtData;
  13.         //interupt
  14.         wire[5:0] intr;
  15.         wire intimer;
  16.         assign intr={5'b0,intimer};
  17.         //FPGA
  18.         wire ramCe,ramWe,ioCe,ioWe;
  19.         wire[31:0] ramWtData,ramAddr,ramRdData;
  20.         wire[31:0] ioWtData,ioAddr,ioRdData;
  21.     MIPS mips0(
  22.         .intr(intr),//
  23.         .intimer(intr[0]),//
  24.         .clk(clk),
  25.         .rst(rst),
  26.         .instruction(instruction),
  27.         .instAddr(instAddr),
  28.         .romCe(romCe),
  29.         .rdData(rdData),        
  30.             .wtData(wtData),        
  31.             .memAddr(memAddr),        
  32.             .memCe(memCe),        
  33.             .memWr(memWr)
  34.     );       
  35.         MIOC mioc0(
  36.                 .memCe(memCe),
  37.                 .memWr(memWr),
  38.                 .memAddr(memAddr),
  39.                 .wtData(wtData),
  40.                 .rdData(rdData),
  41.                 .ramCe(ramCe),
  42.                 .ramWe(ramWe),
  43.                 .ramAddr(ramAddr),
  44.                 .ramRdData(ramRdData),
  45.                 .ramWtData(ramWtData),
  46.                 .ioCe(ioCe),
  47.                 .ioWe(ioWe),
  48.                 .ioAddr(ioAddr),
  49.                 .ioRdData(ioRdData),
  50.                 .ioWtData(ioWtData)
  51. );
  52.    
  53.     InstMem instrom0(
  54.         .ce(romCe),
  55.         .addr(instAddr),
  56.         .data(instruction)
  57.     );
  58. /*
  59.         //DataMem
  60.         DataMem datamem0(      
  61.             .ce(memCe),        
  62.             .clk(clk),        
  63.             .we(memWr),        
  64.             .addr(memAddr),        
  65.             .wtData(wtData),        
  66.             .rdData(rdData)  
  67.         );
  68. */
  69.         DataMem datamem0(
  70.                 .ce(ramCe),
  71.                 .clk(clk),
  72.                 .we(ramWe),
  73.                 .addr(ramAddr),
  74.                 .rdData(ramRdData),
  75.                 .wtData(ramWtData)
  76. );
  77.         IO io0(
  78.                 .ce(ioCe),
  79.                 .clk(clk),
  80.                 .we(ioWe),
  81.                 .addr(ioAddr),
  82.                 .rdData(ioRdData),
  83.                 .wtData(ioWtData)
  84. );
  85. endmodule
复制代码

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表