波特率编程

来源:互联网 发布:php 截断上传 编辑:程序博客网 时间:2024/05/15 23:44
波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示[1]  。
波特率发生器不是产生波特率时钟的,波特率时钟频率/波特率因子=波特率。
波特率发生器的作用是从输入时钟转换出需要的波特率clk
一个完整的由verilog实现的波特率发生器:
module baud_gen(
clk_50MHz, rst_p, bclk
);
input clk_50MHz; /*输入的系统时钟,50MHz*/
input rst_p; /*复位脉冲,高电平有效*/
/* 倍频值16乘以9600波特率,即9600*16=153600,得到波特率发生器的实际输出信号频率为153.6kbit/s */
output bclk; // 输出信号:UART(串口)波特率发生器输出的时钟脉冲,频率:153.60kbps
//即每秒1536000个脉冲,*波特率发生器输出脉冲bclk,注意:除了主频分频之外,
//还决定了这个信号的占空比,在本例中输出信号占空比为 1:325
reg bclk; //寄存器数据类型bclk
reg [8:0] cnt; //寄存器数据类型cnt,9位,UART用它来记录接收到的主频脉冲个数,
//注意在修改输出波特率值时,若占空比小于1:511,需要增加该变量所占位数
//以下语句利用同步计数器完成时钟分频,
always @(posedge clk_50MHz) begin /* 每当信号clk_50MHz发生电平变化执行以下语句 */
if(rst_p) begin /* 如果复位脉冲信号为高电平执行以下语句 */
cnt <= 0; //对主频信号计数器cnt做非阻塞方式复位赋值,赋值为逻辑0 。此后每当时钟信号到来就变。
bclk <= 0; /* 寄存器变量bclk赋值为逻辑0,使该脉冲信号复位为低电平,以低电平作为开始*/
end
else begin
/* 50MHz除以153600(UART实际频率)等于325.5 即50_000_000 /153600 = 325.5(波特率除数) */
if(cnt > 324) begin /*如果cnt的数值大于324,即cnt计数脉冲数等于325(0-324个脉冲)*/
cnt <= 0; /* 50MHz主频信号计数器cnt值,被非阻塞方式复位*/
bclk <= 1; /*串口波特率时钟脉冲信号bclk赋值为逻辑1,使该脉冲信号跳变到高电平周期*/
end
else begin
cnt <= cnt + 1; /* 50MHz主频信号计数器cnt值被非阻塞方式增量赋值(加1) */
bclk <= 0; //波特率发生器时钟脉冲信号bclk被非阻塞方式赋值为’0’,
//使该脉冲信号跳变到低电平周期*/
end
end
end

endmodule


50_000_000 /153600 = 325.5  相当于325分频, 由于串口速率较低,其16 倍频率值也不高,因此在设计中,可以不要求波特率发生器
输出信号的占空比为50%。



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝忌奶晚上哭怎么办 20岁胸下垂松软怎么办 断奶时乳房有肿块怎么办 孩子断奶后乳房变小怎么办 断奶了月经不来怎么办 钥匙在门上拔不出来怎么办 钥匙拔不下来了怎么办 养了几天鱼死了怎么办 乌龟的眼睛肿了怎么办 手被鱼刺扎了怎么办 被鱼刺扎手肿了怎么办 手被桂鱼扎了怎么办 三岁宝宝卡鱼刺怎么办 一岁宝宝卡鱼刺怎么办 鱼刺卡在胸口了怎么办 婴儿被鱼刺卡了怎么办 幼儿被鱼刺卡到怎么办 鱼刺被吞下去了怎么办 喉咙卡到鱼刺下不去怎么办 被小鱼刺卡了怎么办 晚上被鱼刺卡到怎么办 一个小鱼刺卡了怎么办 卡了一个小鱼刺怎么办 鱼刺卡在气管里怎么办 刺蛾幼虫 蛰了怎么办 被杨树辣子蛰了怎么办 蜇了老子蜇了怎么办 被刺蛾幼虫蛰了怎么办 孕妇被蚊虫叮咬发痒怎么办 白掌叶子尖发黄怎么办 白掌叶子卷了怎么办 白掌叶子全软了怎么办? 发财树有黄斑了怎么办 幸福树叶子蔫了怎么办 幸福树枝条塌了怎么办? 幸福树叶子嫣了怎么办 毒蚊子叮咬肿硬怎么办 被蚊子咬了很痒怎么办 蚊子咬了脚肿了怎么办 小孩被蚊子咬了怎么办 小狗老喜欢咬人怎么办