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

 找回密码
 注册
查看: 1092|回复: 4

《黑金Altera开发板Verilog教程V1.1》中的【串口UART实验】中的波特率问题

[复制链接]
zpccx 发表于 2017-3-2 12:55:17 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 zpccx 于 2017-3-2 15:14 编辑

Q1:“数据的波特率位9600bps”,这里为什么是9600bps?   bps讲道理应该是比特率吧。    9600这个数值是怎么确定的?还可以更高吗?

Q2:在串口发送程序中,每16个clk发送一个bit,一帧数据有1个起始位,8个数据位,1个奇偶校验位,一个停止位。
         为什么是要每16个clk发送一个bit?可以每1个clk就发送一个bit吗?

Q3:为何在发送最后一个停止位1之后,还要隔8个clk发送一个1?

附上代码:UART发送


`timescale 1ns/1ps

/*******************************************************************
                                                        Module Name: uarttx
说明:16个clock发送一个数据,1个起始位,8个数据位,1个奇偶校验位,一个停止位
*******************************************************************/

module uarttx(
                                        clk,
                                        rst_n,
                                        datain,
                                        wrsig,
                                        idle,
                                        tx
                                        );

/*
Port decleration
*/
                                       
input clk;                                                //UART时钟
input rst_n;                                        //系统复位
input [7:0] datain;                        //需要发送的数据
input wrsig;                                        //发送命令,上升沿有效

output idle;                                        //线路状态指示,高为线路忙,低为线路空闲
output tx;                                                //发送数据信号

reg idle;
reg tx;

reg send;
reg wrsigbuf,wrsigrise;
reg presult;
reg [7:0] cnt;                                        //计数器

parameter paritymode = 1'b0;


/*
检测发送命令wrsig的上升沿
*/

always @(posedge clk)
        begin
        
        wrsigbuf <= wrsig;
        wrsigrise <= (~wrsigbuf)&wrsig;
        
        end
        
/*
启动串口发送程序
*/

always @(posedge clk)

        begin
        
        if (wrsigrise && (~idle))                                         //当发送命令有效而且线路空闲idle=0时,启动新的发送进程
                begin
                        
                        send <= 1'b1;
                        
                end
               
        else if (cnt==8'd168)                                                 //一帧数据发送结束
               
                        send <= 1'b0;
                        
        end
        
        
/*
串口发送程序,16个时钟发送一个数据帧
*/

always @(posedge clk or negedge rst_n)

        begin
                        
                if(~rst_n)
                        begin
                        tx<=1'b0;
                        idle<=1'b0;
                        cnt<=8'd0;
                        presult<=1'b0;
                        end
               
                else if (send==1'b1)
                        begin
                        
                                case(cnt)                                        //产生起始位
                                8'd0: begin
                                                tx<=1'b0;
                                                idle<=1'b1;
                                                cnt<=cnt+8'd1;
                                                end
                                                
                                8'd16: begin
                                                 tx<=datain[0];        //发送数据0位
                                                 presult<= datain[0]^paritymode;
                                                 idle<=1'b1;
                                                 cnt<=cnt+8'd1;
                                                 end
                                                
                                8'd32: begin
                                                 tx<=datain[1];        //发送数据1位
                                                 presult<=datain[1]^presult;
                                                 idle<=1'b1;
                                                 cnt<=cnt+8'd1;
                                                 end
                                                
                                8'd48: begin
                                                 tx<=datain[2];        //发送数据2位
                                                 presult<=datain[2]^presult;
                                                 idle<=1'b1;
                                                 cnt<=cnt+8'd1;
                                                 end        

                                8'd64: begin
                                                 tx<=datain[3];        //发送数据3位
                                                 presult<=datain[3]^presult;
                                                 idle<=1'b1;
                                                 cnt<=cnt+8'd1;
                                                 end
                                                
                                8'd80: begin
                                                 tx<=datain[4];        //发送数据4位
                                                 presult<=datain[4]^presult;
                                                 idle<=1'b1;
                                                 cnt<=cnt+8'd1;
                                                 end
                                                
                                8'd96: begin
                                                 tx<=datain[5];        //发送数据5位
                                                 presult<=datain[5]^presult;
                                                 idle<=1'b1;
                                                 cnt<=cnt+8'd1;
                                                 end
                           
                                8'd112: begin
                                                 tx<=datain[6];        //发送数据6位
                                                 presult<=datain[6]^presult;
                                                 idle<=1'b1;
                                                 cnt<=cnt+8'd1;
                                                 end
                                                
                                8'd128: begin
                                                 tx<=datain[7];        //发送数据7位
                                                 presult<=datain[7]^presult;
                                                 idle<=1'b1;
                                                 cnt<=cnt+8'd1;
                                                 end
                                                
                                8'd144: begin
                                                 tx<=presult;        //发送奇偶校验位
                                                 presult<=datain[0]^paritymode;
                                                 idle<=1'b1;
                                                 cnt<=cnt+8'd1;
                                                 end
                                                
                                8'd160: begin
                                                        tx<=1'b1;                //发送停止位
                                                        idle<=1'b1;
                                                        cnt<= cnt+8'd1;
                                                  end
                                                  
                                8'd168: begin
                                                        tx<= 1'b1;        
                                                        idle<=1'b0;                //一帧数据发送结束
                                                        cnt<= cnt+8'd1;
                                                        end
                                                        
                                default : cnt<= cnt+8'd1;
                                
                                endcase
                                
                  end
                 
                 
                else
                        begin
                        tx<=1'b1;
                        cnt<=8'd0;
                        idle<=1'b0;
                        end
        end
        
endmodule



video_inout 发表于 2017-3-2 15:23:27 | 显示全部楼层
S1:波特率随意,只要发送和接收方都能支持。只要你能做的更高,1000000000bps也不可怕。S2:设计成16个周期,是设计者的想法,每个人都有每个人的想法,就想穿衣服搭配,当然你也可以尝试使用1个周期,不过半个停止位的时候你就不好处理了。S3:也是设计者的喜好问题
 楼主| zpccx 发表于 2017-3-3 10:23:49 | 显示全部楼层
video_inout 发表于 2017-3-2 15:23
S1:波特率随意,只要发送和接收方都能支持。只要你能做的更高,1000000000bps也不可怕。S2:设计成16个周 ...

谢谢  我看了接收程序后明白了
嗜血草原狼 发表于 2018-2-26 16:25:36 | 显示全部楼层
这份文档发给我一份可好
流_氓_兔 发表于 2018-11-16 23:16:29 来自手机 | 显示全部楼层
建议先理解一下波特率的含义,以及程序使用的时钟
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2019-1-23 01:56 , Processed in 0.066846 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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