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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 9396|回复: 11

[求助] 如何实现两个输入信号触发同一逻辑。

[复制链接]
发表于 2012-8-30 09:34:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本来有个周期1s的外部输入信号signal1触发了一个同步操作,现在需要增加另外一个周期也为1s的外部输入信号signal2也要触发同一操作。
怎样实现呢,FPGA不能在不同的process对同一信号赋值。但是两者要实现同一逻辑的话,就都要对很多相同的信号赋值。有高手知道如何操作么?
例如:process(signal1)
          if(reset) then
            a<= '0';
            b<='1';
            c<= ''0x00000'';
          elsif ((signal1'event and signal1 = '1')and (enable = '1'))then
              c <= c +100;
              .....
现在需要另一个输入信号signal2也触发同样的操作,该如何实现呢。注:触发逻辑很难整理成模块调用。
发表于 2012-8-30 16:57:07 | 显示全部楼层
回复 1# lxtx603


   直接在process内添加一条else if,触发信号为signal2,不可以吗?
 楼主| 发表于 2012-8-30 21:58:37 | 显示全部楼层
回复 2# rvnistelrooy


    不可以的,signal1与signal2都是时钟信号。一个process不可以有两个时钟触发。综合时会报错。
发表于 2012-8-30 23:14:07 | 显示全部楼层
两个触发信号取或以后,再触发这个进程不就行了嘛?如果同时来到,就当做一个触发;如果不同,就形成两次触发。不知道你要的是不是这个结果。
发表于 2012-8-30 23:14:56 | 显示全部楼层
反正你只是判断触发信号的上升沿,他们合并为一个信号也是照样可以这么做的。
 楼主| 发表于 2012-8-31 09:21:26 | 显示全部楼层
回复 4# gaurson


    你的方法在外部的两个时钟信号不是同时到来时即只有一个输入时应该是可以的。但是如果两个信号同时从外部输入时就会出现问题。如果两个信号严格的同时输入,并且相位想同,应该没问题。如果两个信号在不同时刻从外部输入,并且相位不同的话,就会出问题了。
发表于 2012-8-31 13:58:00 | 显示全部楼层
有没有更高速率的时钟?
我对你题目的理解就是,根据2个频率相同、相位关系不固定的时钟,对同一个寄存器赋值。如果没有更高速率的时钟,我想不出对应的硬件。
发表于 2012-8-31 14:22:49 | 显示全部楼层
首先来说,如果电路中出现了必须这样才能正常工作的情况,应该是哪一部分设计出错了。
但一定要这样做,需要确定signal1与signal2的频率是多少,他们之间是否有固定的相位关系,电路部分除了功能正常,还需要考虑实际综合之后的timing能不能满足要求

这里假设singal1是50MHz,而singal2是10MHz,他们异步的clock。
可以用signal1做为DFF时钟,用singal2生成一个信号,输出值是判断singal2的上升沿。
reg signal2_test;
always @(posedge signal2 or sig2_domain_reset_n)begin
    xxxx
    else
       signal2_test <= #`delay  ~signal_test;
end

reg signal2_test_ff1;
reg signal2_test_ff2;
reg signal2_test_ff3;
always @(posedge signal1 or sig1_domain_reset_n)begin
    xxx
    else begin
      signal2_test_ff1 <= #`delay signal2_test;
      signal2_test_ff2 <= #`delay signal2_test_ff1;
      signal2_test_ff3 <= #`delay signal2_test_ff2;
    end
end

wire signal2_test_pos =  signal2_test_ff2 ^ signal2_test_ff3;

所以可以:
process(signal1)
          if(reset) then
            a<= '0';
            b<='1';
            c<= ''0x00000'';
          elsif ((signal1'event and signal1 = '1')))then
            if( (enable = '1' or signal2_test_pos='1')
              c <= c +100;
              .....

当然了,具体做法一定是跟你的时钟,相位关系,输入信号的时序有关的,如果你这个enable一直有效我说的这个方法就不适用,如果两个clcok的频率相差较小,也不能做这做,你需要把前面那些条件说清楚才行。
发表于 2012-8-31 21:35:13 | 显示全部楼层
简单的就是把这两个输入触发信号转化为使能,用一个高倍钟操作
 楼主| 发表于 2012-9-4 16:33:30 | 显示全部楼层




    首先很感谢楼主,你回答的很详细。其实两个输入信号在外部硬件上看来自不同的引脚。对FPGA来说都是频率为1Hz的外部输入时钟信号。z。这两个信号的作用是触发内部的一个帧同步的操作。两者基本不会同时到来,一般情况下只用其中一个信号作为触发条件。
但是为了功能的完善性,需要把两者同时触发的情况也考虑进去。


    此外,FPGA的工作主时钟是20.48MHz.由于输入的触发信号时钟频率较低(1Hz),就直接用这个信号作为触发条件的。直接     


                          process(signal1)
                              if(signal1'event and signal1 = '1')and ( others conditions) then
                                        执行帧同步的操作.....


此外,我在外部对两个时钟做了or操作,然后赋值给另一个信号 signal3 ,把signal3作为触发信号。在signal2无输入,signal1有输入时。
帧同步操作没有被正常触发!不晓得问题出在哪里。初步怀疑signal2无输入时默认电平太高,与signal1 取or后 电平变高了,影响了signal3.
待验证。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-23 03:55 , Processed in 0.025605 second(s), 10 queries , Gzip On, Redis On.

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