可以用CPLD实现信号保持吗?
CPLD芯片是EPM240,晶震为1MHZ。输入的波形,高电平时间约1~3秒。输出是将高电平保持3分钟。怎么用CPLD实现?
单稳态触发器 捕捉上升沿,然后在上升沿开始计时,之后到达3分钟就拉低引脚。这个很简单呀。 用cpld完全可以完成 tiancaigao7 发表于 2012-11-7 12:25 static/image/common/back.gif
捕捉上升沿,然后在上升沿开始计时,之后到达3分钟就拉低引脚。这个很简单呀。 ...
我是按照这种方法做的,可是第一上升沿还可以实现,到了第二个上升沿 得到的波形就不对了 可能是程序有问题,我再仔细查查,谢谢您们。 输入波形的频率是不是太快了? mrbpost 发表于 2012-11-7 12:52 static/image/common/back.gif
我是按照这种方法做的,可是第一上升沿还可以实现,到了第二个上升沿 得到的波形就不对了 可能是程序有问 ...
时序仿真呀,另外考虑是不是输入信号的的频率比3分钟短导致的冲突。 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 触发计时就可以了,但太耗资源了,有什么办法吗? 首先你对这个“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]