搜索
bottom↓
回复: 1

用verilog写UART时遇到的问题

[复制链接]

出0入0汤圆

发表于 2011-6-26 10:37:57 | 显示全部楼层 |阅读模式
模仿写的UART,但只在发送一个字母或数字时正常,传输一串字母却乱码?为什么?

module uart2(clk,rst_n,rs_232_rx,rs_232_tx);

input clk;
input rst_n;
input rs_232_rx;

output rs_232_tx;

wire clk_bps_tx,clk_bps_rx;
wire bps_start_tx,bps_start_rx;
wire rx_int;
wire [7:0] rx_data;

speed_select     speed_rx(
                                                        .clk(clk),
                                                        .rst_n(rst_n),
                                                        .bps_start(bps_start_rx),
                                                        .clk_bps(clk_bps_rx)
                                                  );
                                                  
uart_rx          uart_rx(
                                                        .clk(clk),
                                                        .rst_n(rst_n),
                                                        .clk_bps(clk_bps_rx),
                                                        .rs232_rx(rs_232_rx),
                                                        .bps_start(bps_start_rx),
                                                        .rx_data(rx_data),
                                                        .rx_int(rx_int)
                                                );

//---------------------------------------------------------
speed_select     speed_tx(
                                                        .clk(clk),
                                                        .rst_n(rst_n),
                                                        .bps_start(bps_start_tx),
                                                        .clk_bps(clk_bps_tx)

                                                 );
                                                 
uart_tx          uart_tx(
                                                        .clk(clk),
                                                        .rst_n(rst_n),
                                                        .clk_bps(clk_bps_tx),
                                                        .rx_int(rx_int),
                                                        .rx_data(rx_data),
                                                        .bps_start(bps_start_tx),
                                                        .rs232_tx(rs_232_tx)
                                                );
endmodule
//-------------------------------------------------------------------------------




module speed_select(bps_start,clk,rst_n,clk_bps);
input clk;         //系统时钟50M
input bps_start;   //波特率开始信号
input rst_n;       //异步复位

output clk_bps;    //

parameter   BPS_PARA = 5207;
parameter   BPS_PARA_2 = 2603;

reg [12:0] cnt;
reg clk_bps_r;


always @ (posedge clk or negedge rst_n)
begin
                if(!rst_n)
                        cnt <= 13'd0;
                else if (cnt == BPS_PARA || !bps_start)
                        cnt <= 13'd0;
                else
                        cnt <= cnt + 1'd1;
end

always @ (posedge clk or negedge rst_n)
begin
                if(!rst_n)
                        clk_bps_r <= 1'd0;
                else if(cnt == BPS_PARA_2)
                        clk_bps_r <= 1'd1;
                else
                        clk_bps_r <= 1'd0;
end

assign clk_bps = clk_bps_r;

endmodule
//-------------------------------------------------------------



module uart_rx(clk,clk_bps,rs232_rx,rst_n,bps_start,rx_int,rx_data);

input clk;
input clk_bps;
input rs232_rx;
input rst_n;

output bps_start;
output rx_int;
output [7:0] rx_data;


reg rs232_rx0,rs232_rx1,rs232_rx2,rs232_rx3;
wire neg_rs232_rx;
always @ (posedge clk or negedge rst_n)
begin
                if(!rst_n)
                begin
                        rs232_rx0 <= 1'd0;
                        rs232_rx1 <= 1'd0;
                        rs232_rx2 <= 1'd0;
                        rs232_rx3 <= 1'd0;
                end
                else
                begin
                        rs232_rx0 <= rs232_rx;
                        rs232_rx1 <= rs232_rx0;
                        rs232_rx2 <= rs232_rx1;
                        rs232_rx3 <= rs232_rx2;
                end
end
assign neg_rs232_rx = rs232_rx3 && rs232_rx2 && ~rs232_rx1 && ~rs232_rx0;

reg bps_start_r;
reg rx_int;
reg  [3:0] num;

always @ (posedge clk or negedge rst_n)
begin
                if(!rst_n)
                begin
                        bps_start_r <= 1'd0;//bps_start_r <= 1'dz;
                        rx_int <= 1'd0;
                end
                else if(neg_rs232_rx)
                begin
                        bps_start_r <= 1'd1;
                        rx_int <= 1'd1;               
                end
                else if(num == 4'd12)
                begin
                        bps_start_r <= 1'd0;
                        rx_int <= 1'd0;                       
                end
end
assign bps_start = bps_start_r;

reg [7:0] rx_data_r;
reg [7:0] rx_temp_data;
always @ (posedge clk or negedge rst_n)
begin
                if(!rst_n)
                begin
                        rx_data_r <= 8'd0;
                        rx_temp_data <= 8'd0;
                        num <= 4'd0;
                end
                else if(rx_int)
                                if(clk_bps)
                                begin
                                        num <= num + 4'd1;
                                        case (num)
                                                4'd1 : rx_temp_data[0] <= rs232_rx;
                                                4'd2 : rx_temp_data[1] <= rs232_rx;
                                                4'd3 : rx_temp_data[2] <= rs232_rx;
                                                4'd4 : rx_temp_data[3] <= rs232_rx;
                                                4'd5 : rx_temp_data[4] <= rs232_rx;
                                                4'd6 : rx_temp_data[5] <= rs232_rx;
                                                4'd7 : rx_temp_data[6] <= rs232_rx;
                                                4'd8 : rx_temp_data[7] <= rs232_rx;
                                                default : ;
                                        endcase
                                end
                                else if(num == 4'd12)
                                begin
                                        num <= 4'd0;
                                        rx_data_r <= rx_temp_data;
                                end
end
assign rx_data = rx_data_r;

endmodule
//-----------------------------------------------------------------------
module uart_tx(clk,rst_n,clk_bps,rx_int,rx_data,bps_start,rs232_tx);
input clk;
input rst_n;
input clk_bps;
input rx_int;
input [7:0] rx_data;

output bps_start;
output rs232_tx;

reg rx_int0,rx_int1,rx_int2,rx_int3;
wire neg_rx_int;

always @ (posedge clk or negedge rst_n)
begin
                if(!rst_n)
                begin
                        rx_int0 <= 1'd0;
                        rx_int1 <= 1'd0;
                        rx_int2 <= 1'd0;
                        rx_int3 <= 1'd0;
                end
                else
                begin
                        rx_int0 <= rx_int;
                        rx_int1 <= rx_int0;
                        rx_int2 <= rx_int1;
                        rx_int3 <= rx_int2;
                end
end

assign neg_rx_int = rx_int3 && rx_int2 && ~rx_int1 && ~rx_int0;


reg [7:0] tx_data;
reg bps_start_r;
reg [3:0] num;
reg tx_en;   

always @ (posedge clk or negedge rst_n)
begin
                if(!rst_n)
                begin
                        bps_start_r <= 1'd0;
                        tx_en <= 1'd0;
                        tx_data <= 8'd0;
                end
                else if (neg_rx_int)
                begin
                        bps_start_r <= 1'd1;
                        tx_en <= 1'd1;
                        tx_data <= rx_data;
                end
                else if(num == 4'd11)  //else if(num == 4'd12)
                begin
                        bps_start_r <= 1'd0;
                        tx_en <= 1'd0;
                        tx_data <= 8'd0;
                end
end

assign bps_start = bps_start_r;

reg rs232_tx_r;

always @ (posedge clk or negedge rst_n)
begin
                if(!rst_n)
                begin
                        rs232_tx_r <= 1'd0;
                        num <= 4'd0;
                end
                else if(tx_en)
                begin
                        if(clk_bps)
                        begin
                                num <= num + 4'd1;
                                case (num)
                                        4'd0 : rs232_tx_r <= 1'd0;
                                        4'd1 : rs232_tx_r <= tx_data[0];
                                        4'd2 : rs232_tx_r <= tx_data[1];
                                        4'd3 : rs232_tx_r <= tx_data[2];
                                        4'd4 : rs232_tx_r <= tx_data[3];
                                        4'd5 : rs232_tx_r <= tx_data[4];
                                        4'd6 : rs232_tx_r <= tx_data[5];
                                        4'd7 : rs232_tx_r <= tx_data[6];
                                        4'd8 : rs232_tx_r <= tx_data[7];
                                        4'd9 : rs232_tx_r <= 1'd1;
                                        default : ;//rs232_tx_r <= 1'd1;
                                endcase
                        end
                        else if(num == 4'd11) // else if(num == 4'd12)
                        begin
                                num <= 4'd0;
                        end
                end
end

assign rs232_tx = rs232_tx_r;

endmodule

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-6-26 17:59:07 | 显示全部楼层
到底错在哪里了,实在找不出来!!!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 13:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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