在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: arena

[求助]一个时序如何得到

[复制链接]
发表于 2003-11-12 15:27:54 | 显示全部楼层

[求助]一个时序如何得到

可以根据的要求用计数器来做啊。只要S3的状态满足了,根据控制要求做适当的延时就行了。
 楼主| 发表于 2003-11-12 15:36:06 | 显示全部楼层

[求助]一个时序如何得到

[这个贴子最后由arena在 2003/11/12 03:41pm 第 1 次编辑]

不是你想象的那么简单。
如果帧长不定呢?况且帧长每次都不是预知的。
我也知道S5满足了就行!说点有用的吧
发表于 2003-11-12 15:43:17 | 显示全部楼层

[求助]一个时序如何得到

请问你的工作环境是不是这样的:你的输入是外部送来的一个packet,由sop、eop。你先将这个包存入FIFO,系统侧从FIFO中将packet读走或你主动将包送给系统侧。在这个过程中要将包尾的CRC去掉?
如果是这样的,在FIFO的输入侧肯定可以完成。
方法1:就是我提到的先将波形变换,使EOP有效的那个VAL的宽度大于1。
方法2:在送包时,只有FIFO中的数据大于一定的数量(例如64个字节)或者FIFO中至少有一个EOP才向系统侧送包。当写入EOP时,将FIFO的写指针回退1,就可以将CRC去掉了。
 楼主| 发表于 2003-11-12 16:13:38 | 显示全部楼层

[求助]一个时序如何得到

顾问的理解的工作情形是对的。目前我得系统就是这样。但是我不是为了去掉CRC,而是为了找出CRC的位置,然后把我重新计算的CRC换到这个位置上去。
对于你的方法1,我想知道的是如何进行整形?因为对方的SAR送来的信号也许刚好64字节暂停完之后只剩1个有效的字节的数据了,此时VAL和EOP就有可能出现只有一个字节的情况。我的做法是根据数据的使能把进来的数据直接就写到FIFO中了。我在从FIFO中读取的时候我就想根据读出的帧尾标示得到CRC的位置。但是,由于外部间歇写入FIFO,而内部读取时只要发现FIFO深度大于64字节就开始输出,且一旦输出直到帧尾或者FIFO为空才会停止。所以就出现了我现在的情况,读的过程中前面都是连续的,但是突然FIFO就空了,此时还不是帧尾。且等到发现FIFO非空了,此时就剩一个帧尾数据了。所以,此时去得到CRC的包络如果单纯依靠延迟2个周期,然后与非的方法就出错了。

对于你的方法2,我正在考虑在写入FIFO时,一旦发现EOP我就重写WRADDR-2的位置上的数据做一标志来达到目的。不过,由于系统中我的FIFO写成了一个通用的IPcore的形式,其写入地址和读出地址对于该模块的端口来说是不可见的。所以,我一直不想动用此方法。
发表于 2003-11-12 16:33:50 | 显示全部楼层

[求助]一个时序如何得到

不好意思刚才开会取了,基本上弄明白你的意思了。
我觉得如果既不能从发送侧预知sop的位置,又要求产生的信号延时在5clk只内,从理论上来说就不太可能。
除非你可以忍受一帧的delay,就是说先把这帧暂存,算好位置以后再一起发出去。
发表于 2003-11-12 16:57:23 | 显示全部楼层

[求助]一个时序如何得到

[这个贴子最后由老扁在 2003/11/12 05:20pm 第 2 次编辑]

这个问题,基本上,那个,很难。
因为在你所说的条件下就象要在结果出来以前来预测一样,呵呵。
可能你得参考各位大侠的想法,在数据进FIFO前做工作,另外考虑改造FIFO,或不用FIFO,直接用地址访问缓存。
发表于 2003-11-12 17:08:41 | 显示全部楼层

[求助]一个时序如何得到

我觉得只要设置片内缓冲就可以实现楼主的要求,CRC码只有两个数,我不知道你的数据宽度是多少,假设是16bit,CRC为32bit,每一帧数据长度不定但至少大于3;那么通过以下逻辑实现:设置缓冲1,2均为16bit
S0:idle;
S1:收到SOP后锁存有效数据到内部缓冲1;
S2:收到第二个有效数据后,将缓冲1中的数锁存到缓冲2;
S3:收到第三个和以后的有效数据后判断:
  a.eop存在,将缓冲2中的数据写入FIFO,缓冲1中的数和刚刚收到数为CRC码,状态机可以回S0(idle);
  b.eop部存在,那么将缓冲2中的数写入FIFO,缓冲1中的数锁入缓冲2,刚刚收到的数锁存到缓冲1,状态机进入S3;
通过此种方式虽然找不到楼主想要的两个脉冲,但是可以实现楼主的功能:数据写入FIFO前找到CRC码;
发表于 2003-11-12 20:09:41 | 显示全部楼层

[求助]一个时序如何得到



下面引用由arena2003/11/12 04:13pm 发表的内容:
顾问的理解的工作情形是对的。目前我得系统就是这样。但是我不是为了去掉CRC,而是为了找出CRC的位置,然后把我重新计算的CRC换到这个位置上去。
对于你的方法1,我想知道的是如何进行整形?因为对方的SAR送来的 ...

对第一种方法在包写入FIFO之前先处理一下,对VAL每一个持续有效的时间段,如果他的最后的一个时钟周期(下一个时钟VAL无效)无EOP,则将该时钟的数据延时到下一个VAL有效期的第一个时钟周期。如果是EOP,则停止本次处理。即使输入信号中EOP有效时VAL仅有效一个时钟周期,经过这样的处理,EOP有效时的VAL持续时间也大于一个时钟周期。
在第二种方法中实际上是利用RAM,从模块的输入输出看他是个FIFO,但FIFO内部的读写地址你是可以控制的。
我个人建议你用第二种方法。从你的问题,我已经大致猜出了你的工作,第二种方法在你的工作中有很大的用处。你现在改好了,今后用到的地方多了。
 楼主| 发表于 2003-11-13 09:27:52 | 显示全部楼层

[求助]一个时序如何得到

多谢各位的帮忙指导!
这个问题我已经解决了.
发个帖子恭喜一下啦!
 楼主| 发表于 2003-11-13 09:44:34 | 显示全部楼层

[求助]一个时序如何得到

还是做个总结吧!!
首先非常热情非常真挚地感谢一声叹息和caodb以及bravelu,谢谢你们的热心帮忙和技术指导!
这个问题,我在经历了深思熟虑之后终于有了很好的解决,也为今后类似问题的处理积累了经验。
以前大家都是根据先有的东西去引申其他的东西出来,或者是根据已有的使能生成新的使能。但是,这次的情况非常特殊,只能根据后面的东西去逆推前面的东西。所以,任务的特殊性决定了任务的挑战性。
这次设计思路历程如下:
1)首先解决了16位宽的CRC-32算法的正确性问题。8bit宽的算法和16位时差别很大哟。以前做过8位的,没想到16位的差别还很大,搞了一天出来了。呵呵
2)后用smartbits发任意包长的ethernet包时,下行方向的套片发现有CRC校验错误
为此,采用2分法发现对于某些特定帧长的包会有CRC错,说明了CRC算法不会错,但是某些帧长的CRC错应该是其它原因。经分析,认为是FIFO空时,送给CRC计算模块的帧有效信号对于CRC部分的提取不对
3)从输出端考虑解决在输出时,把CRC的问题解决。苦思冥想后,发现由于FIFO空的时间不定,因此不好解决。
4)变换思路,决定从写入FIFO时就把CRC的标示找出来。但是一样会由于SAR的暂停问题导致帧不连续的问题。最终通过进入FIFO之前经过乒乓寄存器的方法解决了问题。
经验就是遇到问题多多变换思考问题的角度,往往不至于陷入死胡同,可以使问题得以较快解决!!!
还是感谢大家的帮忙!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-23 14:04 , Processed in 0.022154 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表