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

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜帖子
楼主: 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, 2025-8-20 00:21 , Processed in 0.021723 second(s), 6 queries , Gzip On, Redis On.

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