【FPGA】模型机下载FPGA设计

目录

模型机下载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

//datamem70=(r6)=00001120

instmem6=32'b101011_00001_00110_0000_0000_0001_1000; //sw r6,0x18(r1)

//(r7)=datamem70

instmem7=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

//iomem6=(r6)=00001120

instmem9=32'b101011_01000_00110_0000_0000_0001_1000; //sw r6,0x18(r8)

//(r9)=iomem6

instmem10=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
相关推荐
坏孩子的诺亚方舟14 天前
FPGA系统架构设计实践15_高云Arora V系列时钟体系
fpga开发·系统架构
FPGA小徐14 天前
入门 CNN 结构全解析|从流程图理论到 FPGA Verilog 硬件实现(含习题带讲解)
fpga开发
FPGA小徐14 天前
FPGA 数字信号处理:并行 FIR 与串行滤波器设计原理、对比与完整 Verilog 实现
fpga开发
Saniffer_SH15 天前
【高清视频】Gen6 服务器还没到,Gen6 SSD 怎么测?Emily 现场演示三种测试环境
人工智能·驱动开发·测试工具·缓存·fpga开发·计算机外设·压力测试
zlinear数据采集卡15 天前
双核架构深度解析:ARM+FPGA如何让数据采集卡实现500Ksps高性能?
arm开发·fpga开发·架构
9527华安15 天前
FPGA实现GTH Transceivers Wizard传输2路视频,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持
fpga开发·gth·aurora 8b10b·transceivers
FPGA小徐16 天前
FPGA 数字信号处理(二):并行 FIR 滤波器的 Verilog 全流程设计与实现
fpga开发
国科安芯16 天前
基于AS32S601ZIT2型抗辐照MCU的商业航天卫星姿态确定与控制系统研究
单片机·嵌入式硬件·安全·fpga开发·架构·risc-v
ALINX技术博客16 天前
【黑金云课堂】FPGA技术教程FPGA基础:I2C 总线通信技术
fpga开发·i2c
Hello-FPGA16 天前
Xilinx KU040 FPGA Camera Link 图像采集
c++·fpga开发