打印

请教高手,使用FPGA扩展F2812并口应用的问题

[复制链接]
7127|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
请教高手,使用FPGA扩展F2812并口应用的问题

在系统应用中,DSPF2812)与FPGAXilinx Spartan-3 AN)通过F2812XINTF并口相连接,需要在Xilinx FPGA中扩展出一个并口。两者之间的硬件连接如图所示:




有四路开入信号引入到FPGA中,DSP通过并口总线读取四路开入信号的状态。
初学FPGA,为了简化设计,想扩展异步并口,写了以下Verilog代码,实际测试发现,将此代码配置下载到FPGA后,DSP一旦通过并口开始读取FPGA中的数据,DSP程序就会无法运行而导致死机。


//四路DI开入结果输入到FPAG,使用DSP通过异步并口从FPGA中读取开入状态




`define DIAddrOffset_Ch0 16'h2100 //定义DSP寻址四路开入通道的地址


`define DIAddrOffset_Ch1 16'h2101


`define DIAddrOffset_Ch2 16'h2102

`define DIAddrOffset_Ch3 16'h2103




`define DSPAddrWidth 19
//
位宽定义

`define DSPDataWidth 16


`define DIBitWidth 4



module DI_Test(

DSP_XR_Wn,
//DSP
总线读写控制信号,DSP_XR_Wn为高表示总线读为低表示总线写

DSP_XZCS0AND1n, //DSP
片选

DSP_XZCS2n,




DSP_XA, //DSP
地址和数据总线

DSP_XD,




DI_24V,
//24V
外部开入


);



input DSP_XR_Wn;


input DSP_XZCS0AND1n;


input DSP_XZCS2n;




input [`DSPAddrWidth-1 : 0] DSP_XA;


inout [`DSPDataWidth-1 : 0] DSP_XD;


reg [`DSPDataWidth-1 : 0] DSP_XD_out;




input [`DIBitWidth-1 : 0] DI_24V;


initial


begin


DSP_XD_out
<= 16'hzzzz;


end



//当片选无效时,将数据总线设置为高阻输出状态


assign DSP_XD = (!DSP_XZCS0AND1n) ? DSP_XD_out : 16'hzzzz;


//always @ (DSP_XR_Wn or DSP_XZCS0AND1n or DSP_XA)


always @ (DSP_XR_Wn or DSP_XZCS0AND1n or DI_24V or DSP_XA)


begin

//当片选信号有效且XRWn信号有效则读取DI开入状态并将数据结果写到数据总线


if((!DSP_XZCS0AND1n) && DSP_XR_Wn) //DSP_XR_Wn为高表示读;为低表示写


begin


if(DSP_XA==`DIAddrOffset_Ch0)
//读DI开入通道Ch0,将开入状态写到数据总线


DSP_XD_out <= DI_24V[0];


else if(DSP_XA==`DIAddrOffset_Ch1)
//读DI开入通道Ch1


DSP_XD_out <= DI_24V[1];


else if(DSP_XA==`DIAddrOffset_Ch2)
//读DI开入通道Ch2


DSP_XD_out <= DI_24V[2];

else if(DSP_XA==`DIAddrOffset_Ch3)
//读DI开入通道Ch3


DSP_XD_out <= DI_24V[3];


end


end


endmodule

FPGA+DSP连接.JPG (37.95 KB )

FPGA+DSP连接.JPG

相关帖子

沙发
chaiwq2003|  楼主 | 2011-1-14 08:50 | 只看该作者
因此问题被困扰了好几天,恳求高手帮忙解决指点

使用特权

评论回复
板凳
charrijon| | 2011-1-15 22:14 | 只看该作者
FPGA定义CLK输入了吗??

使用特权

评论回复
地板
chaiwq2003|  楼主 | 2011-1-17 14:23 | 只看该作者
没有使用CLK
虽然有DSP的XCLKOUT连接到FPGA,但是没有使用这个信号,扩展的是异步并口

使用特权

评论回复
5
chaiwq2003|  楼主 | 2011-1-17 14:29 | 只看该作者
module DI_Test(
                                DSP_ClkOut,                //DSP外扩总线的同步时钟信号
                                DSP_XR_Wn,                 //DSP总线读写控制信号,DSP_XR_Wn为高表示总线读;为低表示总线写
                                DSP_XZCS0AND1n, //DSP片选
                                DSP_XZCS2n,
                       
                                DSP_XA, //DSP地址和数据总线
                                DSP_XD,
                               
                                DI_5V        //5V开入       
    );

        input DSP_ClkOut;
        input DSP_XR_Wn;
        input DSP_XZCS0AND1n;
        input DSP_XZCS2n;
       
        input [`DSPAddrWidth-1 : 0] DSP_XA;
        inout [`DSPDataWidth-1 : 0] DSP_XD;
        reg [`DSPDataWidth-1 : 0] DSP_XD_out;
       
        input [`DIBitWidth-1 : 0] DI_5V;
        //reg [`DIBitWidth-1 : 0] DI_5V_reg;
       
        //当片选无效时,将数据总线设置为高阻输出状态
        assign DSP_XD = (!DSP_XZCS0AND1n) ? DSP_XD_out : 16'hzzzz;

        always @ (DSP_XR_Wn, DSP_XZCS0AND1n, DSP_XZCS2n, DI_5V)       
        begin
                //当片选信号有效且XRWn信号有效则读取DI开入状态并将数据结果写到数据总线
                if((!DSP_XZCS0AND1n) && DSP_XR_Wn)
                begin
                        if(DSP_XA==`DIAddr_Ch0)                //读DI开入通道Ch0,将开入状态写到数据总线
                                DSP_XD_out <= DI_5V[0];
                        else if(DSP_XA==`DIAddr_Ch1)         //读DI开入通道Ch1
                                DSP_XD_out <= DI_5V[1];
                        else if(DSP_XA==`DIAddr_Ch2)        //读DI开入通道Ch2
                                DSP_XD_out <= DI_5V[2];
                        else if(DSP_XA==`DIAddr_Ch3)        //读DI开入通道Ch3
                                DSP_XD_out <= DI_5V[3];
                        else if(DSP_XA==`DIAddr_Ch4)        //读DI开入通道Ch4
                                DSP_XD_out <= DI_5V[4];
                        else if(DSP_XA==`DIAddr_Ch5)        //读DI开入通道Ch5
                                DSP_XD_out <= DI_5V[5];
                        else if(DSP_XA==`DIAddr_Ch6)        //读DI开入通道Ch6
                                DSP_XD_out <= DI_5V[6];
                end       
        end       
       
endmodule


前几天修改为以上代码号,DSP读取FPGA中的开入寄存器已经OK了,但始终没有弄明白什么原因
接下来测试DSP通过总线写FPGA中的寄存器时,还是偶尔出现了DSP程序死掉的现象,正在测试中

使用特权

评论回复
6
chaiwq2003|  楼主 | 2011-1-19 08:05 | 只看该作者
DSP向FPGA写数据时,使用了XCLKOUT信号,FPGA对照XINTF的访问时序进行数据读取,测试OK

使用特权

评论回复
7
charrijon| | 2011-1-19 12:35 | 只看该作者
那就是时钟的问题了,你之前都没定义clk,FPGA不工作;
不过我看你怎么老喜欢用异步时序,这在FPGA程序小的时候还凑合,程序一大你就又会出问题了;
做成同步时序会解决这个问题。

使用特权

评论回复
8
meng219902| | 2014-3-10 14:41 | 只看该作者

使用特权

评论回复
9
GoldSunMonkey| | 2014-3-11 23:54 | 只看该作者
meng219902 发表于 2014-3-10 14:41

;P

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

83

帖子

0

粉丝