首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

vhdl的问题

vhdl的问题

请教各位:
if clk'event and clk='1' then
    if cnt_read>0 and cnt_read <5 then
        cnt_read:=cnt_read+1;
    else cnt_read:=0;ad2_read<='1';
    end if;
end if;
我想让cnt_read对时钟技术,计到5变为零,实际上就是让ad2_read低电平5个时钟周期,可编译时出错Error: VHDL error at ioctr.vhd(96): can't infer register for signal gen_rc:cnt_read[0] because signal does not hold its value outside clock edge
以前也碰到过这种情况,只能换一种思路做,不知道到底是什么原因,有没有解决办法呢?

if clk'event and clk='1' then
if cnt_read>"000" and cnt_read <"101" then
cnt_read<=cnt_read+1;
else cnt_read<=0;
end if;
end if;
美梦成真-->噩梦降临!
"+"编译通不过
我用xst编译过的,你用的什么软件?
美梦成真-->噩梦降临!
quatus 2 ,我只是想将dsp的读信号延长几个时钟周期作为ad的读信号,但我得时钟频率很慢,检测不到dsp的读信号,所以只能先做一个变量,当dsp发读信号是置1,再检测到时钟的上升沿时计数,计到5时将其清零使ad的读信号无效,不知道有没有别的方法可以实现
时钟频率是多少?
美梦成真-->噩梦降临!
如果你检测不到dsp读信号,就无法处理,你怎么知道dsp读信号来了呢?
美梦成真-->噩梦降临!
cpld的时钟是4m,dsp的读信号是40ns,而ad要求的读信号至少为70ns,如果用时钟同步可能检测不到读信号,所以我先异步检测读信号,又同步延长的,以下是完整一些的程序:
if dsp_aoe='0' and dsp_ce0='0' and dsp_ea11='1' then
ad2_read<='0';
if cnt_read=0 then cnt_read:=1;
end if;
elsif cnt_read=0 then ad2_read<='1';
end if;

if clk'event and clk='1' then
if cnt_read>0 and cnt_read <5 then cnt_read:=cnt_read+1;
else cnt_read:=0;ad2_read<='1';
end if;
cnt_read为integer range 0 to 6;这是在一个process中完成的,不知道是不是相互影响
在一个process中完成,那么敏感信号应该是4m时钟吧?
如果是这样,用4m时钟处理25m的信号,也许你的进程没有被启动,dsp的读信号就已经来了,但是你的进程没有做任何事情.所以这样有问题
美梦成真-->噩梦降临!
我把dsp_aoe dsp_ce0 dsp_ea11 clk都作为敏感信号了,还有就是我将cnt_read定义为信号时发现不论cnt_read是多少,只要一碰到时钟的上升沿就加一,好像判断是否在0-5之间的条件没起作用,版主帮我看一下这条语句有什么不妥吗?
if cnt_read>0 and cnt_read <5 then cnt_read:=cnt_read+1;
最好是能提高你的时钟频率,如果这个有困难,我有个做法你可以参考一下。
1。把你的DSP读信号先送入一个T触发器,具体接法是:时钟接你的DSP读信号,数据端常接“1”,这样的结果就是把你的DSP读信号作了一个二分频处理,并且展宽了这个信号;
2。被展宽信号的上升沿和下降沿都代表了DSP读信号;
3。用4M时钟把上升沿和下降沿提取出来,这个就是用4M可处理的DSP读信号了;

另:如果你的DSP读信号的频率(不是宽度)超过了4M,也就是说读的速度太快,你用4M是无论如何也处理不了的。
美梦成真-->噩梦降临!
多谢版主,已经解决了,用了个很笨的方法,版主的方法我也试一下,再次感谢
lz有什么经验可以过来传授给大家
美梦成真-->噩梦降临!
返回列表