最专业的FPGA ZYNQ论坛--黑金动力社区

 找回密码
 注册
查看: 381|回复: 1

UART串口收发程序调试了快两个星期了还没有搞定,哪位大神帮忙看下到底是哪里有问题

[复制链接]
Kileo 发表于 2017-6-19 17:56:47 | 显示全部楼层 |阅读模式

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

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

x
哪位大神帮忙看下到底哪里出错了,不胜感激!
串口发送模块程序如下:
module UART_TX_INTERFACE(
        // input signal
        input CLK_125MHZ,
        input RSTn,
        input TX_START,                // 发送模块使能标志
        input [7:0] DATA_IN,        // 待发送的数据       
        // output signal
        output TX_DONE,                // 发送完成标志
        output TX_PIN_OUT                // 串口输出数据
);

        /********************************************************/
        /*****************                波特率计时模块                ******************/       
        /********************************************************/
        // Baud Formula::
        //        (1/115200)/(1/(125*10^6)) = 1085
        //        (1/9600)/(1/(125*10^6)) = 13021
        parameter BAUDRATE_115200 = 11'd1085;                // 115200波特率计数器计数值,发送一帧数据需要 11*218=2616 个时钟
        parameter BuadRate_HALF115200 = 10'd543;        // 115200波特率一半的计数器,用于串口接收模块数据位中点値的采集
        parameter BAUDRATE_9600 = 14'd13021;
        parameter BAUDRATE_HALF9600 = 13'd6511;

        /********************************************************/
        wire bps_clk;
        reg [10:0] count_bps;

        always @(posedge CLK_125MHZ or negedge RSTn)
                if(!RSTn)
                        count_bps <= 11'd0;
                else if(TX_START)
                        count_bps <= count_bps + 1'b1;
                else if(count_bps == BAUDRATE_115200 - 1)
                        count_bps <= 11'd0;
                else
                        count_bps <= 11'd0;
                       
        /********************************************************/
        assign bps_clk = (count_bps == BuadRate_HALF115200 - 1) ? 1'b1 : 1'b0;
        /********************************************************/       

        /********************************************************/
        /*****************                串口发送模块                ******************/       
        /********************************************************/       
        reg tx_pin_out;
        reg tx_done;
        reg [3:0] i;

        always @(posedge CLK_125MHZ or negedge RSTn)
                if(!RSTn)
                        begin
                                tx_pin_out <= 1'b1;
                                tx_done <= 1'b0;
                                i <= 4'd0;
                        end
                else if(TX_START)
                        case(i)                               
                                4'd0:                // 发送起始位(一位低电平)
                                        if(bps_clk) begin tx_pin_out <= 1'b0; i <= i + 1'b1; end       
                                        else begin i <= i; end
                                4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8:        // 发送8位数据
                                        if(bps_clk) begin tx_pin_out <= DATA_IN[i - 1]; i <= i + 1'b1; end
                                        else begin i <= i; end
                                4'd9:                // 发送一位奇偶校验位
                                        if(bps_clk) begin tx_pin_out <= 1'b1; i <= i + 1'b1; end
                                        else begin i <= i; end                               
                                4'd10:        // 发送一位停止位
                                        if(bps_clk) begin tx_pin_out <= 1'b1; i <= i + 1'b1; end
                                        else begin i <= i; end                       
                                4'd11:        // 发送完成信号(一个周期脉冲)
                                        if(bps_clk) begin tx_done <= 1'b1; i <= i + 1'b1; end
                                        else begin i <= i; end                                       
                                4'd12:
                                        begin tx_done <= 1'b0; i <= 4'd0; end                                       
                                default: i <= 4'd0;
                        endcase

        /********************************************************/       
        assign TX_DONE = tx_done;                
        assign TX_PIN_OUT = tx_pin_out;
        /********************************************************/               
         
endmodule



串口接收模块程序如下:
module UART_RX_INTERFACE(
        // input signal
        input CLK_125MHZ,
        input RSTn,                        // Active low
        input RX_START,        // 接收模块使能标志
        input RX_PIN_IN,        //        串口输入数据
        // output signal
        output RX_DONE,        // 一个字节数据接收完成标志
        output [7:0] DATA        // 接收到的一个字节数据
);

        /********************************************************/
        /*****************                波特率计时模块                ******************/       
        /********************************************************/
        // Baud Formula::
        //        (1/115200)/(1/(125*10^6)) = 1085
        //        (1/9600)/(1/(125*10^6)) = 13021
        parameter BAUDRATE_115200 = 11'd1085;                // 115200波特率计数器计数值,发送一帧数据需要 11*218=2616 个时钟
        parameter BAUDRATE_HALF115200 = 10'd543;        // 115200波特率一半的计数器,用于串口接收模块数据位中点値的采集
        parameter BAUDRATE_9600 = 14'd13021;
        parameter BAUDRATE_HALF9600 = 13'd6511;
       
        /********************************************************/
        wire bps_clk;
        reg [10:0] count_bps;

        always @(posedge CLK_125MHZ or negedge RSTn)
                if(!RSTn)
                        count_bps <= 11'd0;
                else if(RX_START)
                        count_bps <= count_bps + 1'b1;
                else if(count_bps == BAUDRATE_115200 - 1)
                        count_bps <= 11'd0;                       
                else
                        count_bps <= 11'd0;
                       
        /********************************************************/
        assign bps_clk = (count_bps == BAUDRATE_HALF115200 - 1) ? 1'b1 : 1'b0;
        /********************************************************/

        /********************************************************/
        /*************                        串口接收模块                        ******************/
        /********************************************************/
        reg rx_done;
        (* KEEP = "TRUE" *) reg [3:0] i;
        (* KEEP = "TRUE" *) reg [7:0] rData;

        always @(posedge CLK_125MHZ or negedge RSTn)
                if(!RSTn)
                        begin
                                rx_done <= 1'b0;
                                i <= 4'd0;
                                rData <= 8'hzz;                               
                        end
                else if(RX_START)
                        case(i)               
                                4'd0:                // 接收到起始位(低电平)后使能波特率计时模块
                                        if(!RX_PIN_IN) begin i <= i + 1'b1; end
                                        else begin i <= i; end
                                4'd1:                // 等待半个波特率时间再次确认起始位是否真正到来
                                        if(bps_clk)
                                                if(!RX_PIN_IN) begin i <= i + 1'b1; end
                                                else begin i <= 4'd0; end                       
                                4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8,4'd9:        // 接收八位数据
                                        if(bps_clk) begin rData[i - 2] <= RX_PIN_IN; i <= i + 1'b1; end
                                        else begin i <= i; end
                                4'd10:        // 忽略奇偶校验位
                                        if(bps_clk) begin i <= i + 1'b1; end       
                                        else begin i <= i; end                                       
                                4'd11:        // 忽略停止位
                                        if(bps_clk) begin i <= i + 1'b1; end
                                        else begin i <= i; end                                       
                                4'd12:        // 产生一个时钟脉冲的接收完成信号
                                        begin rx_done <= 1'b1; i <= i + 1'b1; end
                                4'd13:
                                        begin rx_done <= 1'b0; i <= 4'd0; end                               
                                default: i <= 4'd0;
                        endcase
                       
        /********************************************************/
        assign RX_DONE = rx_done;               
        assign DATA = rData;
        /*********************************************************/
                  
endmodule

许多耗子 发表于 2017-7-27 15:32:08 | 显示全部楼层
我现在遇到同样的问题,请问你是怎么解决的啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|@2009-2016 芯驿电子科技(上海)有限公司|小黑屋|手机版|Archiver|黑金动力社区 ( 沪ICP备11013590沪公网安备 31011702000003号

GMT+8, 2017-8-21 06:52 , Processed in 0.067483 second(s), 15 queries , Gzip On.

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表