DSP28335与FPGA通过XINTF总线通信问题 5
做了个DSP28335与FPGA通讯的最小系统板,DSP和FPGA都能进行仿真和下载,把FPGA映射到了DSP的ZONE0区域,FPGA作为DSP的一个外设进行操作,但是...
做了个DSP28335与FPGA通讯的最小系统板,DSP和FPGA都能进行仿真和下载,把FPGA映射到了DSP的ZONE0区域,FPGA作为DSP的一个外设进行操作,但是在两个联合调试的时候出现了以下问题
(1)FPGA运行,DSP单步调试,但是一到操作对Zone 0外部地址0x4500进行写数的时候,DSP仿真就出错,提示Trouble Reading Register PC:(Error -1156 @ 0x0)Device may be operating in low-power mode. Do you want to bring it out of this mode?(Emulation package 5.1.232.0),但是只要让FPGA停止运行,DSP就能正常对外部地址写数,不会出现错误了。(FPGA只是判断地址总线地址,和CS,WE信号 进行读取数据并将数据写进FIFO)
(2)DSP全速运行的时候,FPGA也运行,FPGA给DSP一个中断,DSP对FPGA 0x4500(DSP ZONE0区域)写数,用Signal TapII掐取FPGA信号能够掐到地址总线和数据,但是只收到第一个数据,说明addr,data,cs0,we,oe,连接是正常的。最后我用DSP外部安检作为中断输入测了一下中断函数,只要DSP一运行到操作外部地址的时候就不知道跑去哪了,在产生中断也进不去了,但是八操作地址部分屏蔽的时候,有中断信号就能正常产生中断。
DSP中断函数如下
interrupt void xint1_isr(void)
{
Uint16 i=0;
GpioDataRegs.GPATOGGLE.bit.GPIO13=1;//用来判断中断是否好使,好使则led取反
rd_data[0]=0x34;
rd_data[1]=0x34;
rd_data[2]=0x34;
for(i=0;i<3;i++) *(int *)(0x4500)=rd_data[i];//屏蔽掉这句,有中断信号就能产生中断,不屏蔽这句,有中断进来之后执行到这就不知道跑哪里去了,在有中断也不进
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
FPGA 接收逻辑如下:
module DG_DSP_Write_Test(clk,
rst,addr,data,wr,cs,rd,outreg,fifo_wr,//FIFO写信号,wrusedw//FIFO以用字节数);
input clk;
input rst;
input [18:0]addr;
input [15:0]data;
input wr;
input cs;
input rd;
input [7:0]wrusedw;
output reg [15:0] outreg;
output reg fifo_wr;
wire wre;
assign wre=(!wr)&&(!cs)&&(rd);
reg wre_reg;
reg wre_reg1;
reg wre_reg2;
always@(posedge clk)
begin
if(!rst)
begin
wre_reg<=1'b0;
wre_reg1<=1'b0;
wre_reg2<=1'b0;
end
else
begin
wre_reg<=wre;
wre_reg1<=wre_reg;
wre_reg2<=wre_reg1;
end
end
always@(posedge clk)
begin
if(!rst)
begin
outreg<=16'h0;
fifo_wr<=1'b0;
end
else
begin
if((!wre_reg2)&(wre_reg1)) //判断写信号是否有下降沿产生
begin
if((addr==19'h4500)&&(wrusedw<8'd10))// 判断地址总线和FIFO中的字节数
begin
outreg<=data;
fifo_wr<=1'b1;
end
else
begin
outreg<=16'h0;
fifo_wr<=1'b0;
end
end
end
endmodule 展开
(1)FPGA运行,DSP单步调试,但是一到操作对Zone 0外部地址0x4500进行写数的时候,DSP仿真就出错,提示Trouble Reading Register PC:(Error -1156 @ 0x0)Device may be operating in low-power mode. Do you want to bring it out of this mode?(Emulation package 5.1.232.0),但是只要让FPGA停止运行,DSP就能正常对外部地址写数,不会出现错误了。(FPGA只是判断地址总线地址,和CS,WE信号 进行读取数据并将数据写进FIFO)
(2)DSP全速运行的时候,FPGA也运行,FPGA给DSP一个中断,DSP对FPGA 0x4500(DSP ZONE0区域)写数,用Signal TapII掐取FPGA信号能够掐到地址总线和数据,但是只收到第一个数据,说明addr,data,cs0,we,oe,连接是正常的。最后我用DSP外部安检作为中断输入测了一下中断函数,只要DSP一运行到操作外部地址的时候就不知道跑去哪了,在产生中断也进不去了,但是八操作地址部分屏蔽的时候,有中断信号就能正常产生中断。
DSP中断函数如下
interrupt void xint1_isr(void)
{
Uint16 i=0;
GpioDataRegs.GPATOGGLE.bit.GPIO13=1;//用来判断中断是否好使,好使则led取反
rd_data[0]=0x34;
rd_data[1]=0x34;
rd_data[2]=0x34;
for(i=0;i<3;i++) *(int *)(0x4500)=rd_data[i];//屏蔽掉这句,有中断信号就能产生中断,不屏蔽这句,有中断进来之后执行到这就不知道跑哪里去了,在有中断也不进
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
FPGA 接收逻辑如下:
module DG_DSP_Write_Test(clk,
rst,addr,data,wr,cs,rd,outreg,fifo_wr,//FIFO写信号,wrusedw//FIFO以用字节数);
input clk;
input rst;
input [18:0]addr;
input [15:0]data;
input wr;
input cs;
input rd;
input [7:0]wrusedw;
output reg [15:0] outreg;
output reg fifo_wr;
wire wre;
assign wre=(!wr)&&(!cs)&&(rd);
reg wre_reg;
reg wre_reg1;
reg wre_reg2;
always@(posedge clk)
begin
if(!rst)
begin
wre_reg<=1'b0;
wre_reg1<=1'b0;
wre_reg2<=1'b0;
end
else
begin
wre_reg<=wre;
wre_reg1<=wre_reg;
wre_reg2<=wre_reg1;
end
end
always@(posedge clk)
begin
if(!rst)
begin
outreg<=16'h0;
fifo_wr<=1'b0;
end
else
begin
if((!wre_reg2)&(wre_reg1)) //判断写信号是否有下降沿产生
begin
if((addr==19'h4500)&&(wrusedw<8'd10))// 判断地址总线和FIFO中的字节数
begin
outreg<=data;
fifo_wr<=1'b1;
end
else
begin
outreg<=16'h0;
fifo_wr<=1'b0;
end
end
end
endmodule 展开
7个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |