请教一个问题,大虾请进
用DSP + FPGA 实现一些脉冲编码输出,FPGA负责编码输出,DSP做一些控制,以及对FPGA输出编码的配置,DSP与FPGA之间通过数据线、地址线、片选线相连,
FPGA内部的不同模块采用地址线译码后具有独立的地址,DSP通过读写这些地址来控制输出
现象:
单独用FPGA工作是,脉冲输出波形很好,
DSP采用uClinux系统运行后,脉冲输出波形出现很多毛刺,
请大家帮忙分析下有哪些原因导致的?
刚分析下,是否有可能是DSP的SDRAM与FPGA的数据、地址总线公用的原因?
同一块硬件电路吗?
补充一下:
DSP核心频率400M ,EBIU 80M FPGA 50Mhz
硬件电路是同一块,以上所说的只是将DSP程序不启动的情况下,脉冲输出物毛刺
若一块硬件电路板有多控制芯片,如FPGA+DSP,或者FPGA+ARM时候i,会考虑三个方面问题:
1. 数据BUS和地址BUS的问题;
2.高频分布参数的影响;
3.接口时序同步的问题。
据小编所说问题,1的问题应该没有涉及到,因为1出现问题电路板输出会出现错误,问题2则会对输出波形有影响会产生高频分量进而出现脉冲失真。怀疑是3的问题。
DSP把FPGA当做外围芯片可以,但若是对FPGA输出控制信号,应该在FPGA内部对控制信号做同步处理,不知小编是直接把DSP输出给FPGA的信号拿来用了么?还是做了相应的同步处理?(用高脉冲采样,或者两个寄存器打拍?)
与FPGA相接得地址线、数据线采用双向驱动,只对读写信号打了一拍,您说的是地址线跟数据线也要打吗?
对地址和数据bus总线打拍就没有用了,寄存器打拍只是对单bit有用。你需要对读写控制以及其他控制信号与数据、地址信号的同步做一下优化(参考异步时钟域有关资料)。这些都是个人建议,毕竟没有看到你的设计。我觉得这是接口问题造成的。
在FPGA内部信号有时也会出现短暂的亚稳态,那些大都因为数据信号与时钟信号延迟不同造成的。希望能对你有帮助。
非常感谢,根据你说的,我把问题定位了一下,发现了问题的所在:
1.环境描述:
数据线: DSP <-> FPGA <-> LCD
地址线: DSP -> FPGA -> LCD
其中数据、地址线在FPGA中的逻辑如下:
module bf518_busbuf( input [16:1] DSPaddr, //DSP的数据线
output [16:1] LCDaddr, //经FPGA后输出到LCD的数据线,且FPGA内部也要用到
input DSPoe, //DSP读使能信号
input DSPams_n, //DSP片选
inout [15:0] DSPdata, //与DSP数据线相接
inout [15:0] LCDdata); //FPGA内部及LCD用数据线
wire cs,from_bf,to_bf;
assign cs = ~DSPams_n;
assign to_bf = ~DSPoe;
assign from_bf = DSPoe;
assign LCDaddr = DSPaddr;
assign DSPdata= (cs & to_bf )? LCDdata:16'hzzzz;
assign LCDdata= from_bf? DSPdata:16'hzzzz;
endmodule
2. 发现问题:
1)将LCDaddr 、LCDdata地址线、数据线仅用于内部使用而不输出到引脚给LCD用时,输出正常;
2)将LCDaddr 、LCDdata地址线、数据线输出到引脚给LCD用时,输出不正常正常;
烦请分析指教!非常感谢!
指教不敢当,我对DSP了解比较少,只是一些皮毛,暂且把它当做一个普通芯片来说。说的不对,你也包涵。
你写的这些组合逻辑应该只是你程序的一部分吧。DSPaddr与LCDaddr应该是地址信号吧?
暂且不说其他没有写出来的逻辑,只对
assign DSPdata= (cs & to_bf )? LCDdata:16'hzzzz; (1)
assign LCDdata= from_bf? DSPdata:16'hzzzz; (2)
这两句赋值语句说一下。若DSP读使能(称OE吧)为高,满足(2),LCD从DSP读数,假设为0xabcd;当OE为低且(1)条件为真,小编的意思应该是DSP读取LCD中的数值,但此时(2)LCDdata为16'hz,究竟是(2)中LCDdata先变化还是(1)中DSPdata先读数呢?这个不好判断。
再者,小编说不把信号引到外围管脚上时序正常,这个可能是因为FPGA在综合的时候把这部分逻辑去掉了。即:assign LCDdata= from_bf? DSPdata:16'hzzzz;
这个程序中用到了inout,我的意见是小编用寄存器暂存,使用时序电路试试。
非常感谢你的及时回复,能否就上述模块指点下你说的用暂存器的inout用法?
这个问题比较复杂,我就举个例子抛砖引玉吧。比如只考虑一段时间,在这段时间内完成DSP的一次读和一次写。这样举例是为了把inout信号既能做一次input信号,也能做一次output信号。
你可以用一个clk做同步时钟,假设这段时间内有一个计数器count从0计数到15;
程序代码可以类似于:
always @ (posedge clk) begin
if (!rst) begin
.......
end else begin
if (count == 0) begin
LCDdata <= DSPdata;
xxx <= 16'hz;
OE <= 1'b1;
.......
end else if (count == 4) begin
DSPdata <= LCDdata;
xxx <= 16'hz;
OE <= 1'b0;
.......
end else if (count == xxx) begin
.......
.......
end
end
end
当然,你也可以自己定义reg变量,把LCDdata或者DSPdata的值付给这些中间变量,以方便再次的读写。
