搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2012-11-7 11:53:10 | 显示全部楼层 |阅读模式
CPLD芯片是EPM240,晶震为1MHZ。
输入的波形,高电平时间约1~3秒。输出是将高电平保持3分钟。怎么用CPLD实现?

本帖子中包含更多资源

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

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-11-7 12:21:21 | 显示全部楼层
单稳态触发器

出0入0汤圆

发表于 2012-11-7 12:25:14 | 显示全部楼层
捕捉上升沿,然后在上升沿开始计时,之后到达3分钟就拉低引脚。这个很简单呀。

出0入22汤圆

发表于 2012-11-7 12:25:22 来自手机 | 显示全部楼层
用cpld完全可以完成

出0入0汤圆

 楼主| 发表于 2012-11-7 12:52:19 | 显示全部楼层
tiancaigao7 发表于 2012-11-7 12:25
捕捉上升沿,然后在上升沿开始计时,之后到达3分钟就拉低引脚。这个很简单呀。 ...

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

出0入0汤圆

发表于 2012-11-7 13:27:56 | 显示全部楼层
输入波形的频率是不是太快了?

出0入0汤圆

发表于 2012-11-7 14:00:20 | 显示全部楼层
mrbpost 发表于 2012-11-7 12:52
我是按照这种方法做的,可是第一上升沿还可以实现,到了第二个上升沿 得到的波形就不对了 可能是程序有问 ...

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

出0入0汤圆

 楼主| 发表于 2012-11-7 18:04:57 | 显示全部楼层
tiancaigao7 发表于 2012-11-7 14:00
时序仿真呀,另外考虑是不是输入信号的的频率比3分钟短导致的冲突。

谢谢您们的回复,是我程序的问题,我是将1MHZ时钟1000分频后再做定时器,实际是这个定时器没法清零,所以第二个上升沿就乱了。
reg [8:0] 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 [17:0] timer1_cnt;
always @(posedge CLK_K)
   begin
    if (~timer1_enable)  //0
       timer1_cnt = 0;
    else
       timer1_cnt = timer1_cnt + 1'b1;
    end      

/*******************************************************/
reg  save_in;
reg  signal_out;
reg  signal_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 触发计时就可以了,但太耗资源了,有什么办法吗?

出0入0汤圆

发表于 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‰
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 07:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表