mrbpost 发表于 2012-11-7 11:53:10

可以用CPLD实现信号保持吗?

CPLD芯片是EPM240,晶震为1MHZ。
输入的波形,高电平时间约1~3秒。输出是将高电平保持3分钟。怎么用CPLD实现?

t2397362 发表于 2012-11-7 12:21:21

单稳态触发器

tiancaigao7 发表于 2012-11-7 12:25:14

捕捉上升沿,然后在上升沿开始计时,之后到达3分钟就拉低引脚。这个很简单呀。

zxq6 发表于 2012-11-7 12:25:22

用cpld完全可以完成

mrbpost 发表于 2012-11-7 12:52:19

tiancaigao7 发表于 2012-11-7 12:25 static/image/common/back.gif
捕捉上升沿,然后在上升沿开始计时,之后到达3分钟就拉低引脚。这个很简单呀。 ...

我是按照这种方法做的,可是第一上升沿还可以实现,到了第二个上升沿 得到的波形就不对了 可能是程序有问题,我再仔细查查,谢谢您们。

wildone 发表于 2012-11-7 13:27:56

输入波形的频率是不是太快了?

tiancaigao7 发表于 2012-11-7 14:00:20

mrbpost 发表于 2012-11-7 12:52 static/image/common/back.gif
我是按照这种方法做的,可是第一上升沿还可以实现,到了第二个上升沿 得到的波形就不对了 可能是程序有问 ...

时序仿真呀,另外考虑是不是输入信号的的频率比3分钟短导致的冲突。

mrbpost 发表于 2012-11-7 18:04:57

tiancaigao7 发表于 2012-11-7 14:00 static/image/common/back.gif
时序仿真呀,另外考虑是不是输入信号的的频率比3分钟短导致的冲突。

谢谢您们的回复,是我程序的问题,我是将1MHZ时钟1000分频后再做定时器,实际是这个定时器没法清零,所以第二个上升沿就乱了。
reg counter = 9'b000000000;
always @(posedge CLK)   
   begin
    if(counter==9'd499) //9'd499   1000分频 1ms
      counter <= 0;
   else
      counter <= counter+1;
   end

reg CLK_K = 1'b0 ;
always @(posedge CLK)
begin
    if(counter==9'd499)
      CLK_K <= ~CLK_K;
    else
      CLK_K <= CLK_K ;
end

//++++++++++++++++++++++++++++++++++++++
// 定时器1 开始
// 时长:
//++++++++++++++++++++++++++++++++++++++
reg      timer1_enable;
reg timer1_cnt;
always @(posedge CLK_K)
   begin
    if (~timer1_enable)//0
       timer1_cnt = 0;
    else
       timer1_cnt = timer1_cnt + 1'b1;
    end      

/*******************************************************/
regsave_in;
regsignal_out;
regsignal_in;
always @(posedge CLK )
begin: sh
    begin
       if ((save_in == 1'b0)&&( signal_in== 1'b1))
          begin
          timer1_enable=1;
          signal_out=1;
          end
       else
      signal_out= signal_out;
   if (timer1_cnt==180000)
         signal_out=0;
   else
         signal_out= signal_out;
    end
      save_in=signal_in;
end

可能这样做不行,如果我把定时器的触发做在always @(posedge CLK )这个模块内,用CLK 触发计时就可以了,但太耗资源了,有什么办法吗?

eduhf_123 发表于 2012-11-7 18:36:09

首先你对这个“3分钟”的精度要求有多高?

直接做一个28位的计数器,在计数器的高12位上做一个跟0xABA判相等的数值比较器就好,这样对D触发器的占用应该可以控制在60个以下。
0xABA 0000 = 179961856
绝对误差:180000000 - 179961856 = 38144,大约是38个毫秒
相对精度:38144 / 180000000 = 0.212‰

或者进一步用0xAC0 0000,只比较高6位:
0xAC0 0000 = 180355072,绝对误差355个毫秒,相对精度1.973‰
页: [1]
查看完整版本: 可以用CPLD实现信号保持吗?