|
发表于 2013-3-29 09:35:28
|
显示全部楼层
我做过红白机(NES)这颗IC,给你一些提示。
1. bin文件可以转成文本的十六进制或二进制,一行一个地址的数据,然后利用verilog的$readmem/$readmemh函数读入,如果是synplify之类的综合软件,会综合出带CODE的ROM。
reg [BUS_W-1:0] mem [(1<<(ADDR_W-1))-1:0];
reg [ADDR_W-1:0] rd_addr;
initial
begin
$readmemh(ROM_FILE,mem);
$display("**************************************************************");
$display("* *");
$display("* Read code file from file %s *",ROM_FILE);
$display("* *");
$display("**************************************************************");
end
always @(posedge clk)
begin
if (ce & we)
mem[addr] <= #`U_DLY di;
rd_addr <= #`U_DLY addr;
end
assign #`U_DLY dout = (/* ce & */ oe) ? mem[rd_addr] : {BUS_W{1'b0}};
上面的代码在做RTL仿真或综合时都可以用。
另外,除非你的FPGA BLOCK RAM够大,否则不一定能装下整个游戏。
2. 主机是不包含你图里最上面黄色方框这部分(Mapper + PROM+VROM+VRAM)。你如果只做主机(插游戏卡),这部分不都要考虑。如果你要连游戏一起跑,就是把游戏卡这部分做进来 ,那Mapper不得不考虑,现在的游戏卡大多是多合一的,且Mapper种类较多,你需要确定你游戏卡对应的Mapper。
3. 如果跑单个小游戏,可以不包含mapper,只需要PROM、VROM。
4. 下面是我写的将bin转换成hex文件的一段程序,供参考(BCB编写)
int iIn,iOut;
int iLength,iInst,iAddr,i;
unsigned char *cTmp = new char[20];
if (OpenDialog1->Execute ())
{
asFileIn = OpenDialog1->FileName;
if ((iIn = FileOpen(asFileIn,fmOpenRead)) == -1)
{
MessageDlg("Can't open input file!",mtError,TMsgDlgButtons()<<mbOK,0);
return;
}
}
else
return;
EditInputFile->Text = asFileIn;
asFileOut = ChangeFileExt(ExtractFileName(asFileIn),".mem");
EditOutputFile->Text = asFileOut;
FileSeek(iIn,0,0);
if ((iOut = FileCreate(asFileOut)) == -1)
{
MessageDlg("Can't create the output file!",mtError,TMsgDlgButtons()<<mbOK,0);
return;
}
for(iAddr=0;/* iAddr<iLength && */ iAddr<StrToInt(EditDepth->Text);iAddr++)
{
if (FileRead(iIn,cTmp,1) <= 0)
break;
iInst = cTmp[0]; // + cTmp[1]*0x100;
if (CheckAddr->Checked)
wsprintf(cTmp,"@%05x %02x\r\n",iAddr,iInst);
else
wsprintf(cTmp,"%02x //@%05x\r\n",iInst,iAddr);
FileWrite(iOut,cTmp,StrLen(cTmp));
}
FileClose(iIn);
FileClose(iOut);
MessageDlg("Convert successfully!",mtInformation,TMsgDlgButtons()<<mbOK,0);
delete cTmp;
|
|