打印
[CPLD]

cpld 做两路串口的切换

[复制链接]
1461|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cpld 做两路串口的切换 : 串口通过CPLD 后,接收到的数据 多了好多00000000 改怎么处理 如下图:,中间选中的,为有用的数据,其他好多无用的00,程序仅是通过 按键做两路 串口的切换。
assign xutxd1_c = (state_code == 1'b0)?xutxd2:sa_xutxd1;
assign xurxd1_c = (state_code == 1'b0)?xurxd2:sa_xurxd1;

改怎么处理才不会收到这么多无用的数据?求大神们指教!!

154312qeop36kepjjgcj63.png (28.9 KB )

154312qeop36kepjjgcj63.png

相关帖子

沙发
玄德| | 2016-8-15 09:05 | 只看该作者

怀疑是外部导致的,比如按键,
与CPLD无关了。


使用特权

评论回复
板凳
297229936|  楼主 | 2016-8-15 09:45 | 只看该作者
玄德 发表于 2016-8-15 09:05
怀疑是外部导致的,比如按键,
与CPLD无关了。

按键我做了20ns的抖动处理,应该不是按键的问题,是不是我其他没用的IO没有处理好导致的?请指教,谢谢!

使用特权

评论回复
地板
玄德| | 2016-8-15 09:48 | 只看该作者
297229936 发表于 2016-8-15 09:45
按键我做了20ns的抖动处理,应该不是按键的问题,是不是我其他没用的IO没有处理好导致的?请指教,谢谢! ...


换个实验方式,
比如先抛开按键,CPLD内部直接接通,然后看有没有这么多0。


使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
297229936 + 1 很给力!
5
297229936|  楼主 | 2016-8-15 09:53 | 只看该作者
玄德 发表于 2016-8-15 09:48
换个实验方式,
比如先抛开按键,CPLD内部直接接通,然后看有没有这么多0。

好的,谢谢指导!非常感谢。

使用特权

评论回复
6
玄德| | 2016-8-15 10:15 | 只看该作者

20ns的抖动处理

不是毫秒?   


使用特权

评论回复
7
297229936|  楼主 | 2016-8-15 10:22 | 只看该作者
玄德 发表于 2016-8-15 09:48
换个实验方式,
比如先抛开按键,CPLD内部直接接通,然后看有没有这么多0。

代码改了下,抛开了按键,CPLD内部直接连通,就没有那么多0了,果然大神啊!膜拜!谢谢指导!不胜感激!我改下按键代码试试!

使用特权

评论回复
8
玄德| | 2016-8-15 10:25 | 只看该作者
297229936 发表于 2016-8-15 10:22
代码改了下,抛开了按键,CPLD内部直接连通,就没有那么多0了,果然大神啊!膜拜!谢谢指导!不胜感激! ...


稍加点拨就有结果,孺子可教!





使用特权

评论回复
9
297229936|  楼主 | 2016-8-15 10:25 | 只看该作者
玄德 发表于 2016-8-15 10:15
20ns的抖动处理

不是毫秒?

按键部分的代码:
reg[3:0]keyr;
always@(posedge clk or negedge key_rst)
        if(!key_rst)keyr<=4'b1111;
        else keyr <= {keyr[2:0],key_sel};
wire key_pos = keyr[2]&~keyr[3];
wire key_neg = ~keyr[2]&keyr[3];

reg[19:0] cnt;
always@(posedge clk or negedge key_rst)
        if(!key_rst)cnt <= 20'd0;
        else if(key_neg||key_pos) cnt <= 20'd0;
        else if(cnt <=20'd999_999)cnt <= cnt +1'b1;
        else cnt <= 20'b0;
       
reg[1:0]key_value;
always@(posedge clk or negedge key_rst)
        if(!key_rst) key_value[0] <= 1'b1;
        else if(cnt==20'd999_999)key_value[0] <=keyr[3];

always@(posedge clk or negedge key_rst)
                if(!key_rst)key_value[1] <=1'b1;
                else key_value[1] <= key_value[0];
               
wire led_ctrl = ~key_value[0]&key_value[1];

always@(posedge clk or negedge key_rst)
begin
                if(!key_rst)
                state_code <=1'b0;
        else
        begin
                 if(led_ctrl)
                 begin
                 if(state_code == 1'b1)
                 state_code <= 1'b0;
                 else
                 state_code <= 1'b1;
                 end
        end
end

请指导,为什么会出现那么多00?

使用特权

评论回复
10
297229936|  楼主 | 2016-8-15 10:28 | 只看该作者
玄德 发表于 2016-8-15 10:15
20ns的抖动处理

不是毫秒?

20ms 锁存一次键值

使用特权

评论回复
11
玄德| | 2016-8-15 10:43 | 只看该作者
本帖最后由 玄德 于 2016-8-15 10:44 编辑

应当是消抖没起到作用,造成开关抖动。

没细看全部代码,但这段就有逻辑问题,消抖根本无效:
只有第一个else在运行,后面两个根本没进入。
always@(posedge clk or negedge key_rst)
        if(!key_rst)cnt <= 20'd0;
        else if(key_neg||key_pos) cnt <= 20'd0;
        else if(cnt <=20'd999_999)cnt <= cnt +1'b1;
        else cnt <= 20'b0;



使用特权

评论回复
12
297229936|  楼主 | 2016-8-15 10:52 | 只看该作者
玄德 发表于 2016-8-15 10:43
应当是消抖没起到作用,造成开关抖动。

没细看全部代码,但这段就有逻辑问题,消抖根本无效:

谢谢解答! 我再看看。 新用户每小时限制回帖5个,是在太.... 还不能发消息...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

52

帖子

2

粉丝