fpga 与DSP 并口 通信的问题
大家好,想请教下,我现在做DSP和FPGA 的XINTF通信就是FPGA像SRAM那样, dsp就想读写SRAM那样。但是发现在读的时候,FPGA判断的地址不对 ,比方说,dsp就往0X2001那个地址写数,再读出来。在读的时候,FPGA发现地址不是0x2001.读出来的数就不对。但是并不是每次都不对,偶尔不对。是不是时需配合的有问题呢?我是严格按照 TI给的时序做的啊。 但是仿真不对,麻烦给看看代码,哪里的问题呢?module CommandOperate(resetcommandmainprocess,
DSP_DATA,DSP_ADDR,dsp_we,dsp_rd,cs_fpga,
LED1);
input resetcommandmainprocess;
input dsp_we,dsp_rd,cs_fpga;
inoutDSP_DATA;
input DSP_ADDR;
output LED1;//LED2;
/////////////////////////////////////////
reg Reg_LED1;//Reg_LED2;
reg rd_data;
always @(posedge dsp_rd or posedge resetcommandmainprocess )
begin
if (resetcommandmainprocess) begin
rd_data<= 16'bzzzz_zzzz_zzzz_zzzz;
end
else if (( DSP_ADDR == 5'b11000)&&(cs_fpga == 0))
rd_data<= Reg_LED1;
else rd_data<= 16'bzzzz_zzzz_zzzz_zzzz;
end
assign DSP_DATA=rd_data ;
///////////////////////////////////////////////
always @(posedge dsp_we or posedge resetcommandmainprocess)
begin
if (resetcommandmainprocess)begin
Reg_LED1<=16'h0000;
end
else if(( DSP_ADDR == 5'b11000)&&(cs_fpga == 0))
Reg_LED1<= DSP_DATA;
end
assign LED1=1'b1;//Reg_LED1;
endmodule ./emotion/em101.gif./emotion/em103.gif./emotion/em148.gif./emotion/em147.gif 如果就这样像MCU操作读写好像不行吧,FPGA有些RAM但是地址是不定,应该需要你去做一些控制器后才能正确用,比如说FIFO之类的,还有些如DPRAM的IP,这样后你才可以去读写和管理的。不知道你外面有没有挂什么存储器。 fpga外面没有挂存储器,他当做SRAM一样被DSP读写
大侠,我有写的程序,你看看,就这几句话都不对啊。
module CommandOperate(
DSP_RSTn,//Inputs from MAX811
RDn,
WEn, //from DSP2812
DSP_DATA,
DSP_ADDR,
CS0AND1n,
/////////////////////////////////////////
LD
);
////////////////////////////////////////////
input DSP_RSTn;//Inputs from MAX811
input RDn;
input WEn; //from DSP2812
inout DSP_DATA;
input DSP_ADDR;
input CS0AND1n;
/////////////////////////////////////////
output LD;
////////////////////////////////////////////////////////
regLED;
///////////////////////
reg rd_data;
///////////////////////////////////////////////////
always @(posedge RDn or posedge DSP_RSTn )
begin
if (DSP_RSTn) begin
rd_data <= 16'bzzzzzzzzzzzzzzzz;
end
else if (( DSP_ADDR == 13'b0000000000001)&& (CS0AND1n == 0 ))
rd_data<=LED;
else rd_data <= 16'bzzzzzzzzzzzzzzzz;
end
assign DSP_DATA=rd_data;
///////////////////////////////////////////////
always @(posedge WEn or posedge DSP_RSTn )
begin
if (DSP_RSTn) begin
LED <= 0;
end
else if (( DSP_ADDR == 13'b0000000000001 )&& (CS0AND1n == 0 ))
LED<= DSP_DATA;
end
assign LD=LED;
endmodule
下面是仿真波形
http://cache.amobbs.com/bbs_upload782111/files_49/ourdev_706546RZEW68.GIF
(原文件名:fpga.GIF) LD 是我要的数据,我把它先写到01地址,再度01地址,第二次就不对了。data那根线出问题了,结果LD就错了,变成了0b000000000000X,怎么会这样呢?这仿真就不过啊。我都弄了两天了,就这几句话。 兄弟姐妹们啊,我还在加班啊,救救我吧。 很想帮你,但是看了半天还是没弄清楚到底你描述的是什么问题。
你是用的FPGA内部的LE来构建的一个SRAM吗?
那你贴的代码又是什么东西? DSP没输出时钟么 ,有的话 ,搞成同步的 或者到 Altera官搜设计参考啊 , Xilinx是有的 我是FPGA想做sram让DSP去读写它。 应该对读写信号RDn WEn的下降沿敏感吧…… 对微处理器与FPGA的总线接口,常规的方法是用同步逻辑,而不是异步。
你的DSP应该有一个外总线的参考时钟RefClk,用它当作FPGA的时钟就行了。
通常的接口逻辑写法是:
always @(posedge RefClk)
begin
if(CS有效)
begin
case(地址)
//对每个可以读或写的地址,分别处理
地址1:
if(读信号有效)
begin
//返回该地址的寄存器数据到输出总线(该总线应当是双向的,由CS和读信号打开输出,其他时候都是输入)
else if(写信号有效)
begin
//把数据总线上的数据写入内部寄存器,或者执行某个特定操作...
...
end ;
//处理下一个地址
地址2:
......
endcase
end
end;
常规的双向总线(假设为8位)接口的写法是
inout iodata;
reg outbuf;
assign iodata =(读信号有效 && CS有效)?outbuf:`bz;
//iodata用于读,outbuf用于写 回复【9楼】zkf0100007
或者到 altera官搜设计参考啊 , xilinx是有的
-----------------------------------------------------------------------
加我下QQ三三零79零零65,找你问点东西 回复【11楼】caplsc
-----------------------------------------------------------------------
对的,谢谢
页:
[1]