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

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜全文
查看: 10653|回复: 29

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

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

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

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

×
本帖最后由 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-6-22 16:42:59 | 显示全部楼层
chipscope或者其他的fpga的工具在板子上运行的时候down一下内部的波形,再找原因。
让我们帮你分析你的code,首先大家没那时间,也没那精力,只能给你提点建议啊之类的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-21 17:17:15 | 显示全部楼层
28# mosou 改了接收模块后出问题, 应该是接收模块的问题
回复 支持 反对

使用道具 举报

发表于 2010-6-21 16:42:43 | 显示全部楼层
先问一下,是收不到数据,还是数据接受错误。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-21 15:58:00 | 显示全部楼层
谢谢大家的热心帮助
我找到了一个比较好的网站,讲串口的,但没有在板子上试过,贴上来一起研究研究
http://www.fpga4fun.com/SerialInterface.html
回复 支持 反对

使用道具 举报

发表于 2010-5-24 10:53:16 | 显示全部楼层
1# picassoye

如果你认为自己理解的协议和代码实现,仿真都没有问题的话,可否把实际信号测量出来看看逻辑是否和自己设想的一样。

如果不一样,可能是你自己的语法导致实现与仿真不一致;
如果一样,可能是对协议理解有问题,可否找台带UART协议的示波器或者逻辑分析仪测试一下?
也有可能是波特率什么的设置有问题;
也有可能主机串口设置或者电学上有问题;

一个一个排除好了。
回复 支持 反对

使用道具 举报

发表于 2010-5-19 18:12:10 | 显示全部楼层
看起来 貌似和我的问题是一样的,不知道那位大侠 可以解释原因
回复 支持 反对

使用道具 举报

发表于 2010-5-19 11:16:24 | 显示全部楼层
下到板子上用signaltap看看那里除了问题。
回复 支持 反对

使用道具 举报

发表于 2010-5-19 09:43:01 | 显示全部楼层
能加个testbench方个仿真图上来吗这样好分析
回复 支持 反对

使用道具 举报

发表于 2010-5-18 22:52:16 | 显示全部楼层
向UART接口这种慢速接口协议最好还是做个滤波,因为你的眼跳变可能都要比你的时钟周期长的
这样能保证接入的数据是正确的,
剩下的就是注意采样要在数据的中间采样,保证数据的正确性,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2025-10-20 19:05 , Processed in 0.032716 second(s), 6 queries , Gzip On, Redis On.

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