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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 8105|回复: 29

[求助] uart串口接收模块的问题

[复制链接]
发表于 2010-4-20 15:28:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
本帖最后由 picassoye 于 2010-4-20 16:49 编辑

大家好:
我弄了一个uart接收模块,但是有问题,接收不到数据,看了好多遍还是找不出问题,不知道问题出在哪里???
各位帮帮忙啊,代码如下



`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date:    16:25:45 04/14/2010
// Design Name:
// Module Name:    uart_rev
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module uart_rev(
        iclk,
        irstx,
        irxd,
        odata,
        oreceived_char
    );
        
         input iclk;
         input irstx;
         input irxd;
         output [7:0]odata;
         output oreceived_char;
        
        reg rg_rxd;
        reg [13:0]counter;
        reg [3:0]rev_bits_count;
        reg [7:0]odata;
        reg rg_rev_check;
        reg oreceived_char;
        reg [3:0]CS,NS;
        
        wire w_clk;

        parameter       IDLE=4'b0000,
                              START=4'b0001,
                              REV_BIT=4'b0010,
                              REV_CHECK=4'b0100,
                              REV_STOP=4'b1000;
        parameter DELAY_COUNT=14'b01_0100_0101_0110;//'d5206
        parameter BITS_PER_CHAR=3'b110; //'d6
        
        //generate the slow clock
        always@(posedge iclk or negedge irstx)begin
        if(~irstx)
            counter<=14'b0;
        else
            begin
                if(w_clk)
                counter<=14'b0;
                else
                counter<=counter+1'b1;
            end
        end
        
        assign w_clk=(counter==DELAY_COUNT);
        
        always@(posedge iclk or negedge irstx)begin
            if(~irstx)
            rg_rxd<=1'b1;
            else
            rg_rxd<=irxd;
        end
        
        //the state register
        always@(posedge w_clk or negedge irstx)begin
        if(~irstx)
            CS<=IDLE;
        else
            CS<=NS;
        end
        
        //the combinational logic
        always@(*)begin
            case(CS)
                    IDLE:if(~rg_rxd) NS=START;
                    START:NS=REV_BIT;
                    REV_BIT:if(rev_bits_count[3])NS=REV_CHECK;//8 cycles, 1 byte
                    REV_CHECK:NS=REV_STOP;
                    REV_STOP:NS=IDLE;
                    default:NS=IDLE;
            endcase
        end
        
        always@(posedge w_clk or negedge irstx)begin
        if(~irstx)
            rev_bits_count<=BITS_PER_CHAR;
        else
        if(CS==IDLE)
            rev_bits_count<=BITS_PER_CHAR;
        else
        if(CS==REV_BIT)
            rev_bits_count<=rev_bits_count-1'b1;
        else
            rev_bits_count<=rev_bits_count;
        end
        
        always@(posedge w_clk or negedge irstx)begin
        if(~irstx)
            odata<=8'b0;
        else
        if(CS==IDLE)
            odata<=8'b0;
        else
        if(CS==REV_BIT)
            odata[7:0]<={rg_rxd,odata[7:1]};//右移一位
        else
            odata<=odata;
        end
        
        always@(posedge w_clk or negedge irstx)begin
        if(~irstx)
            rg_rev_check<=1'b0;
        else if(CS==IDLE)
            rg_rev_check<=1'b0;
        else if(CS==REV_CHECK)
            rg_rev_check<=rg_rxd;
        else
            rg_rev_check<=rg_rev_check;
        end
        
        always@(posedge w_clk or negedge irstx)begin
        if(~irstx)
            oreceived_char<=1'b0;
        else if(CS==IDLE)
            oreceived_char<=1'b0;
        else if(CS==REV_CHECK)
            oreceived_char<=1'b1;
        else
            oreceived_char<=1'b0;
        end
endmodule
发表于 2010-4-20 15:43:36 | 显示全部楼层
重新看UART协议吧,然后仿真看对不对
发表于 2010-4-20 15:51:37 | 显示全部楼层
看不大懂··如果你要是VHDL的模块我能帮你解决的。。
发表于 2010-4-20 15:53:24 | 显示全部楼层
对了,收不到数据的话你可以看下数据输入以及接收数据之前的条件是否成立,然后一步一步往下查···还有个可能就是你发送和接收数据的波特率是否一致。。
 楼主| 发表于 2010-4-20 16:03:35 | 显示全部楼层
我弄了一下仿真,按照那个协议,rxd先给个低信号,然后再给数据,从波形图上看,状态转换正常,odata的值也有,但是下载到板子上就是不行
 楼主| 发表于 2010-4-20 16:07:01 | 显示全部楼层
4# emakltuz 波特率都是按9600弄的,应该不会有问题
发表于 2010-4-20 16:11:25 | 显示全部楼层


我弄了一下仿真,按照那个协议,rxd先给个低信号,然后再给数据,从波形图上看,状态转换正常,odata的值也有,但是下载到板子上就是不行
picassoye 发表于 2010-4-20 16:03


那你可以查下你的输入信号也就是接收的数据对么?仿真的时候有个低电平起始位的话,那你实际板子上的输入数据对吗?
 楼主| 发表于 2010-4-20 16:26:57 | 显示全部楼层
7# emakltuz 我用“串口调试助手”输入数据,原来有一个接收模块,可以正确接收,只是代码看起来有点乱。
所以自己重新弄一个,现在这个模块基本上是按照那个模块的思路弄的
发表于 2010-4-20 16:43:53 | 显示全部楼层
8# picassoye
首先确定两点,一就是你用别人的模块可以接收,那说明硬件方面没有问题;二就是UART模块一般都是来数据就接收了,你收不到说明你接收部分的状态机没有跳转,状态机的跳转需要的条件你是否符合,必要的时候你可以把他们引出来,还可以把状态机的状态编码引出来看停止在哪个状态。你自己可以仔细查查逻辑是否有遗漏的地方。我刚刚又尝试着看了下你的逻辑,很多语法都不大懂,SORRY了。。
发表于 2010-4-20 17:14:16 | 显示全部楼层
你原来的模块就是这样的思路?没有高倍率采样你怎么采得到正确的信号?你写的和UART的要求的差距很大
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-4-28 22:02 , Processed in 0.034394 second(s), 8 queries , Gzip On, Redis On.

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