軟件:vivado
語言:Verilog
代碼功能:
存儲器用于存儲數(shù)據(jù)和指令。
MIPS32處理器的地址總線32位,數(shù)據(jù)總線32位,但是存儲器按字節(jié)編址,因此存儲器容量為232×8位=4GB,地址范圍0x00000000 XFFFF FFFF。
但是MIPS32處理器絕大部分指令對存儲器的訪問尺寸為字(Word,32位),即訪問地址必須按照4字節(jié)的邊界嚴格對齊(地址最低2位=00)。至于MPS的一個字的字節(jié)大小端問題,選擇小端格式:高字節(jié)(MSB)在高地址,低字節(jié)(LSB)在低地址。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設計文檔:
1. 工程文件
2. 程序文件
3. 程序編譯
4. Testbench
Test1
Test2
5. 仿真圖
Test1仿真
Test2仿真
部分代碼展示:
//存儲器 module?DATA_RAM( input?clk,//時鐘 input?rst_n,//復位 input?enable,//使能信號 input?write,//寫控制信號 input?[31:0]?addr_rd,//讀地址(最低2位為00) input?[31:0]?addr_wr,//寫地址(最低2位為00) input?[31:0]?data_wr,//寫數(shù)據(jù) output?reg?[31:0]?data_rd//讀數(shù)據(jù) ); //大端存儲:數(shù)據(jù)的高字節(jié)存儲在內(nèi)存低地址,數(shù)據(jù)的低字節(jié)存儲在內(nèi)存高地址 //例如存儲0x12345678,地址和數(shù)據(jù)對應關系為:00-12;01-34;02-56;03-78 parameter?N=512;//定義存儲器的深度N reg?[7:0]?dm_mem?[N-1:0];??//定義一個深度為N,寬度為8位的內(nèi)存 //寫數(shù)據(jù) integer?i; always?@(posedge?clk?or?negedge?rst_n) ????if(!rst_n)//復位 ????????for(i?=?0;?i?<?N;?i?=?i?+?1)??//內(nèi)部先初始化為0 ???????????dm_mem[i]?<=?8'h0; ????else?if(write?&&?enable)begin//當寫信號來且使能信號有效時,將寫數(shù)據(jù)寫入對應地址的內(nèi)存 ????????dm_mem[addr_wr]???<=?data_wr[31:24];?//大端格式,高字節(jié)存儲在內(nèi)存低地址 dm_mem[addr_wr+1]?<=?data_wr[23:16];? dm_mem[addr_wr+2]?<=?data_wr[15:8]?;? dm_mem[addr_wr+3]?<=?data_wr[7?:0]?;?//數(shù)據(jù)的低字節(jié)存儲在內(nèi)存高地址 end //讀數(shù)據(jù) always?@(posedge?clk?or?negedge?rst_n) if(!rst_n) data_rd<=32'd0;//復位 else?if(enable)begin//使能信號有效 data_rd[31:24]<=dm_mem[addr_rd];?//大端格式,高字節(jié)存儲在內(nèi)存低地址,讀addr_rd數(shù)據(jù) data_rd[23:16]<=dm_mem[addr_rd+1]; data_rd[15:8]?<=dm_mem[addr_rd+2]; data_rd[7?:0]?<=dm_mem[addr_rd+3];?//數(shù)據(jù)的低字節(jié)存儲在內(nèi)存高地址 end else//使能信號無效 data_rd<=32'bZ;//無效數(shù)據(jù) endmodule
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=481