马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
目次
模子机下载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
- `include "define.v"
- module MIOC(
- input wire memCe,
- input wire memWr,
- input wire [31:0] memAddr,
- input wire [31:0] wtData,
- input wire[31:0] ramRdData,
- input wire[31:0] ioRdData,
- output reg[31:0] rdData,
- output reg ramCe,
- output reg ramWe,
- output reg [31:0] ramAddr,
- output reg[31:0] ramWtData,
- output reg ioCe,
- output reg ioWe,
- output reg[31:0] ioAddr,
- output reg [31:0] ioWtData
- );
- always@(*)
- if(memCe == `RamEnable)
- // if(memAddr & 32'hF000_0000 == 32'h7000_0000) //按位与结果不对
- if(memAddr >= 32'h7000_0000 && memAddr<32'h8000_0000)
- begin
- ioCe= `RamEnable;
- ioWe = memWr;
- ioAddr = memAddr;
- ramCe= `RamDisable;
- ramWe = `RamUnWrite;
- ramAddr = `Zero;
- end
- else
- begin
- ioCe = `RamDisable;
- ioWe= `RamUnWrite;
- ioAddr = `Zero;
- ramCe= `RamEnable;
- ramWe = memWr;
- ramAddr = memAddr;
- end
- else
- begin
- ioCe= `RamDisable;
- ioWe= `RamUnWrite;
- ioAddr = `Zero;
- ramCe= `RamDisable;
- ramWe = `RamUnWrite;
- ramAddr = `Zero;
- end
-
- always@(*)
- if(memCe == `RamEnable)
- if(ramCe ==`RamEnable)
- begin
- rdData= ramRdData;
- ramWtData = wtData;
- ioWtData= `Zero;
- end
- else
- begin
- rdData = ioRdData;
- ramWtData= `Zero;
- ioWtData=wtData;
- end
- else
- begin
- rdData= `Zero;
- ramWtData= `Zero;
- ioWtData= `Zero;
- end
- endmodule
复制代码 IO.v
- `include "define.v";
- module IO(
- input wire ce,
- input wire clk,
- input wire we,
- input wire[31:0]addr,
- input wire[31:0]wtData,
- output reg[31:0]rdData
- /*IO interface*/
- );
- /*access IO device*/
- reg [31:0] iomem [1023 : 0];
- always@(*)
- if(ce == `RamDisable)
- rdData = `Zero;
- else
- rdData = iomem[addr[11 : 2]];
- always@(posedge clk)
- if(ce == `RamEnable && we == `RamWrite)
- iomem[addr[11 : 2]] = wtData;
- else ;
- endmodule
复制代码 SoC.v
- module SoC(
- input wire clk,
- input wire rst
- );
- wire [31:0] instAddr;
- wire [31:0] instruction;
- wire romCe;
- //ls
- wire memCe, memWr;
- wire [31:0] memAddr;
- wire [31:0] rdData;
- wire [31:0] wtData;
- //interupt
- wire[5:0] intr;
- wire intimer;
- assign intr={5'b0,intimer};
- //FPGA
- wire ramCe,ramWe,ioCe,ioWe;
- wire[31:0] ramWtData,ramAddr,ramRdData;
- wire[31:0] ioWtData,ioAddr,ioRdData;
- MIPS mips0(
- .intr(intr),//
- .intimer(intr[0]),//
- .clk(clk),
- .rst(rst),
- .instruction(instruction),
- .instAddr(instAddr),
- .romCe(romCe),
- .rdData(rdData),
- .wtData(wtData),
- .memAddr(memAddr),
- .memCe(memCe),
- .memWr(memWr)
- );
- MIOC mioc0(
- .memCe(memCe),
- .memWr(memWr),
- .memAddr(memAddr),
- .wtData(wtData),
- .rdData(rdData),
- .ramCe(ramCe),
- .ramWe(ramWe),
- .ramAddr(ramAddr),
- .ramRdData(ramRdData),
- .ramWtData(ramWtData),
- .ioCe(ioCe),
- .ioWe(ioWe),
- .ioAddr(ioAddr),
- .ioRdData(ioRdData),
- .ioWtData(ioWtData)
- );
-
- InstMem instrom0(
- .ce(romCe),
- .addr(instAddr),
- .data(instruction)
- );
- /*
- //DataMem
- DataMem datamem0(
- .ce(memCe),
- .clk(clk),
- .we(memWr),
- .addr(memAddr),
- .wtData(wtData),
- .rdData(rdData)
- );
- */
- DataMem datamem0(
- .ce(ramCe),
- .clk(clk),
- .we(ramWe),
- .addr(ramAddr),
- .rdData(ramRdData),
- .wtData(ramWtData)
- );
- IO io0(
- .ce(ioCe),
- .clk(clk),
- .we(ioWe),
- .addr(ioAddr),
- .rdData(ioRdData),
- .wtData(ioWtData)
- );
- endmodule
复制代码
|