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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: picassoye

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

[复制链接]
 楼主| 发表于 2010-4-20 17:50:22 | 显示全部楼层


8# picassoye  
首先确定两点,一就是你用别人的模块可以接收,那说明硬件方面没有问题;二就是UART模块一般都是来数据就接收了,你收不到说明你接收部分的状态机没有跳转,状态机的跳转需要的条件你是否符合,必要 ...
emakltuz 发表于 2010-4-20 16:43

呵呵,谢谢你了,我再仔细看看
 楼主| 发表于 2010-4-20 17:53:24 | 显示全部楼层


你原来的模块就是这样的思路?没有高倍率采样你怎么采得到正确的信号?你写的和UART的要求的差距很大
falloutmx 发表于 2010-4-20 17:14

你说的有道理!
原来那个模块是开发板自带的代码,也没有采样,可能数据的准确率会有问题
我想先把功能实现了,然后再加进去数据采样的部分
 楼主| 发表于 2010-4-21 09:40:54 | 显示全部楼层


你原来的模块就是这样的思路?没有高倍率采样你怎么采得到正确的信号?你写的和UART的要求的差距很大
falloutmx 发表于 2010-4-20 17:14

原来这个模块是这样的,我用这个模块试了一下没问题,从仿真来看,感觉区别就是它的输出比改了以后的模块提前了半个多周期
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date:    14:53:51 04/15/2010
// Design Name:
// Module Name:    rev
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module rev(
        rst,
        clk50,
        rxd,
       
        odata,
        received_char

    );
       
        input rst;
        input clk50;
        input rxd;
        output [7:0]odata;
        output received_char;
       
        reg rxd_reg;
        reg [7:0]rev_char;
        reg rev_check;
        reg [2:0] REV_state;
        reg [3:0] rev_bits_count;
        reg [13:0] REV_counter;
        reg received_char;
       
        parameter DELAYCOUNT= 14'b01_0100_0101_0110; //5206+1+1=5208
        parameter BITS_PER_CHAR=3'b110;  //6+1+1=8
        parameter REV_IDLE=3'b000,
                                                REV_START=3'b001,
                                                REV_BIT=3'b010,
                                                REV_CHECK=3'b101,
                                                REV_STOP=3'b100;
       
        assign odata=rev_char;
       
        always @ (posedge clk50)
        begin
                if(~rst)
                begin
                        rxd_reg<=1;
                end
                else
                begin
                        rxd_reg<=rxd;
                end
        end
       
//state machine
always @ (posedge clk50)
        if(~rst)
        begin
                rev_char<=8'b0;
                REV_counter<=DELAYCOUNT;
                REV_state<=REV_IDLE;
                rev_bits_count<=BITS_PER_CHAR;
                received_char<=0;
        end
        else
                case(REV_state)
                        REV_IDLE:         begin
                                                        REV_counter<=DELAYCOUNT;
                                                        rev_bits_count<=BITS_PER_CHAR;
                                                        received_char<=0;
                                                        rev_check<=0;
                                                        rev_char<=8'b0;
                                                        if(~rxd_reg)
                                                        begin
                                                                REV_state<=REV_START;       
                                                        end       
                                                end
                        REV_START:      begin
                                                        if(REV_counter[13])
                                                        begin
                                                                REV_state<=REV_BIT;
                                                                REV_counter<=DELAYCOUNT;
                                                        end
                                                        else
                                                                REV_counter<=REV_counter-1;                               
                                                end
                        REV_BIT:                begin
                                                        if(REV_counter[13])
                                                        begin
                                                                REV_state<=REV_BIT;
                                                                REV_counter<=DELAYCOUNT;       
                                                                if(rev_bits_count[3])
                                                                begin
                                                                        REV_state<=REV_CHECK;
                                                                        REV_counter<=DELAYCOUNT;
                                                                end
                                                                else
                                                                rev_bits_count<=rev_bits_count-1;
                                                        end
                                                        else
                                                                REV_counter<=REV_counter-1;
                                                                if(REV_counter==2500)
                                                                begin
                                                                        rev_char[7:0]<={rxd_reg,rev_char[7:1]};
                                                                end
                                                end
                        REV_CHECK:     begin
                                                        if(REV_counter[13])
                                                        begin
                                                                REV_state<=REV_STOP;
                                                                REV_counter<=DELAYCOUNT;
                                                                received_char<=1;
                                                        end
                                                        else
                                                                REV_counter<=REV_counter-1;
                                                                if(REV_counter==2500)
                                                                begin
                                                                        rev_check<=rxd_reg;
                                                                end       
                                                end
                        REV_STOP:        begin       
                                                        received_char<=0;
                                                        if(REV_counter[13])
                                                        begin
                                                                REV_state<=REV_IDLE;
                                                                REV_counter<=DELAYCOUNT;
                                                        end
                                                        else
                                                                REV_counter<=REV_counter-1;
                                                end
                        default:
                                                REV_state<=REV_IDLE;
                endcase


endmodule
 楼主| 发表于 2010-4-21 13:58:18 | 显示全部楼层
13# picassoye 哪位高人帮我看看
 楼主| 发表于 2010-4-22 09:03:03 | 显示全部楼层


你原来的模块就是这样的思路?没有高倍率采样你怎么采得到正确的信号?你写的和UART的要求的差距很大
falloutmx 发表于 2010-4-20 17:14

你有没有写的好一点的模块?贴一个我学习学习
发表于 2010-4-22 23:49:54 | 显示全部楼层
邦定了
 楼主| 发表于 2010-4-23 16:22:20 | 显示全部楼层

where...?
发表于 2010-4-23 17:52:12 | 显示全部楼层
仿真才好快速分析,网上下的不要钱的东东多数是这样的,这样才能防什么也不会的人,盗取技术人员的利益,建义大家开放原代码时都这样做,说实话,我网上下过不少代码,有点知识,分析一下,多数好解决,防就是防什么也不会的人的.
发表于 2010-4-27 15:36:54 | 显示全部楼层
仿真正确的话,就得考虑电器特性的问题了。
你用示波器看看,RX\TX端的信号与仿真波形是否一致。
发表于 2010-5-13 13:06:46 | 显示全部楼层
为何不写成一级状态机,起始位数据位,校验位和停止位都在一个always里接收呢.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-13 01:15 , Processed in 0.030559 second(s), 6 queries , Gzip On, Redis On.

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