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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
EETOP诚邀模拟IC相关培训讲师 创芯人才网--重磅上线啦!
楼主: icfriend

[求助] 从事模拟设计多年的人,求助一个数字初级问题。

[复制链接]
发表于 2014-3-4 10:03:39 | 显示全部楼层
我写了一段Verilog的代码,可以实现你说的功能:
因为你是32KHz的时钟,所以当脉冲宽度小于1/32kHz时,有可能采样不到!

`define time_1ms 32                //32KHz system clock

module signal_process( clk, rst, din, dout );

        input clk;
        input rst;
        input din;
        output dout;
       
        reg dout;
        reg [1:0] state;
        reg [5:0] cnt_high;
        reg [5:0] cnt_low;
       
        //*******************************************************************************************
        //state transfer: input(state and din), output(state)
        //*******************************************************************************************
        always @( posedge clk )
                if(rst)        begin
                        state <= 2'd0;
                        cnt_high <= 6'd0;
                        cnt_low <= 6'd0;
                end
                else begin
                        case(state)
                                2'd0:        begin
                                                        if(din)        begin
                                                                cnt_low <= 6'd0;
                                                                if(cnt_high == `time_1ms)        begin
                                                                        cnt_high <= 6'd0;
                                                                        state <= 2'd1;
                                                                end
                                                                else
                                                                        cnt_high <= cnt_high + 1'b1;
                                                        end
                                                        else        begin
                                                                cnt_high <= 6'd0;
                                                                if(cnt_low == `time_1ms)        begin
                                                                        cnt_low <= 6'd0;
                                                                        state <= 2'd2;
                                                                end
                                                                else
                                                                        cnt_low <= cnt_low + 1'b1;
                                                        end
                                                end
                                2'd1:        begin
                                                        if(!din)        begin
                                                                cnt_high <= 6'd0;
                                                                if(cnt_low == `time_1ms)        begin
                                                                        cnt_low <= 6'd0;
                                                                        state <= 2'd2;
                                                                end
                                                                else
                                                                        cnt_low <= cnt_low + 1'b1;
                                                        end
                                                        else        begin
                                                                cnt_low <= 6'd0;
                                                        end
                                                end
                                2'd2:        begin
                                                        if(din)        begin
                                                                cnt_low <= 6'd0;
                                                                if(cnt_high == `time_1ms)        begin
                                                                        cnt_high <= 6'd0;
                                                                        state <= 2'd1;
                                                                end
                                                                else
                                                                        cnt_high <= cnt_high + 1'b1;
                                                        end
                                                        else        begin
                                                                cnt_high <= 6'd0;
                                                        end
                                                end
                                default:        ;
                        endcase
                end
       
        //*******************************************************************************************
        //give a value to dout according to state
        //*******************************************************************************************
        always @( posedge clk )
                if(rst)
                        dout <= 1'b0;
                else       
                        case(state)
                                2'd0:                dout <= 1'b0;
                                2'd1:                dout <= 1'b1;
                                2'd2:                dout <= 1'b0;
                                default:        ;
                        endcase

endmodule

波形1

波形1
发表于 2014-3-4 10:06:11 | 显示全部楼层
另外,就是当既检测不到高电平超过1MS,也检测不到低电平超过1ms时,默认输出为0
发表于 2014-3-15 19:26:14 | 显示全部楼层
你自己摆一个gate级的电路应该不难吧,用counter去数就行,input的边沿作为counter的reset信号
 楼主| 发表于 2014-4-21 23:16:38 | 显示全部楼层
感谢诸位的回答,非常感谢
发表于 2014-4-22 10:06:58 | 显示全部楼层
用32k时钟和RS触发器做一个计数器,计数器在in信号变化和计数满1ms时reset,同时计数满1ms时输出out信号。
发表于 2014-8-30 22:17:16 | 显示全部楼层
很好的资料
发表于 2014-9-10 20:32:33 | 显示全部楼层
用32KHz的时钟对输入信号进行采样,使用两个计数器,一个计数器重复计数0-31,另外一个计数器为采样到的高电平个数,每32个时钟周期将计数个数存储,使用组合逻辑进行判断,由于信号有干扰,因此可以定收到高电平个数在25-32个时输出1,高电平个数在0-5输出为低,其余情况可以自定义,用verilog语言很好写的
发表于 2014-9-25 17:18:02 | 显示全部楼层
杀鸡焉用牛刀?最简单的,加二级滤波吧。
发表于 2014-9-29 16:44:55 | 显示全部楼层
路过~~~~~
发表于 2014-10-9 08:27:34 | 显示全部楼层
过来看看 都忘光了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-29 08:58 , Processed in 0.024494 second(s), 9 queries , Gzip On, Redis On.

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