3510|4

167

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

FPGA 串口 波特率 发生器 代码 求教 [复制链接]

代码如下:25M晶振下产生115200的波特率 没有过采样
//////////////////////////////////////////////////////////////////////////////////
module BaudTickGen(
        input clk, enable,
        output tick  // generate a tick at the specified baud rate * oversampling
);


        parameter ClkFrequency = 25000000;
        parameter Baud = 115200;
        parameter Oversampling = 1;


        function integer log2(input integer v);
        begin
                log2=0;
                while(v>>log2) log2=log2+1;
        end
        endfunction


        localparam AccWidth = log2(ClkFrequency/Baud)+8;  // +/- 2% max timing error over a byte
        reg [AccWidth:0] Acc = 0;
        localparam ShiftLimiter = log2(Baud*Oversampling >> (31-AccWidth));  // this makes sure Inc calculation doesn't overflow
        localparam Inc = ((Baud*Oversampling << (AccWidth-ShiftLimiter))+(ClkFrequency>>(ShiftLimiter+1)))/(ClkFrequency>>ShiftLimiter);


        always @(posedge clk)
        begin
                if(enable) Acc <= Acc[AccWidth-1:0] + Inc[AccWidth:0];
                else Acc <= Inc[AccWidth:0];
        end       
        assign tick = Acc[AccWidth];


endmodule
///////////////////////////////////////////////////////////////////////////////
有如下疑问:
1.ACC的宽度处有一个+8,不明白为什么是8
2.+/- 2% max timing error over a byte 是如何计算的?

其实这个程序源于以下波特率发生器的介绍,但同样有疑问:
But what do you do if all your have is, say, a 2MHz clock? To generate 115200Hz from a 2MHz clock, you divide the clock by "17.361111111..." Not exactly a round number. The solution is to divide sometimes by 17, sometimes by 18, making sure the ratio stays "17.361111111". That's actually easy to do.
Look at the following "C" code:
while(1) // repeat forever
{
  acc += 115200;
  if(acc>=2000000) printf("*"); else printf(" ");


  acc %= 2000000;
}
That prints the "*" in the exact ratio, once every "17.361111111..." loops on average.
To obtain the same thing efficiently in an FPGA, we rely on the fact that the serial interface can tolerate a few % of error in the baud frequency generator.
It is desirable that the 2000000 be a power of two. Obviously 2000000 is not. So we change the ratio... Instead of "2000000/115200", let's use "1024/59" = 17.356. That's very close to our ideal ratio, and makes an efficient FPGA implementation.
// 10 bits for the accumulator ([9:0]), and one extra bit for the accumulator carry-out ([10])
reg [10:0] acc;   // 11 bits total!


always @(posedge clk)
  acc <= acc[9:0] + 59; // use only 10 bits from the previous result, but save the full 11 bits


wire BaudTick = acc[10]; // so that the 11th bit is the carry-out
Using our 2MHz clock, "BaudTick" is asserted 115234 times a second, a 0.03% error from the ideal 115200.
Parameterized FPGA baud generator
The previous design was using a 10 bits accumulator, but as the clock frequency increases, more bits are required.
Here's a design with a 25MHz clock and a 16 bits accumulator. The design is parameterized, so easy to customize.
parameter ClkFrequency = 25000000; // 25MHz
parameter Baud = 115200;
parameter BaudGeneratorAccWidth = 16;
parameter BaudGeneratorInc = (Baud<


reg [BaudGeneratorAccWidth:0] BaudGeneratorAcc;
always @(posedge clk)
  BaudGeneratorAcc <= BaudGeneratorAcc[BaudGeneratorAccWidth-1:0] + BaudGeneratorInc;


wire BaudTick = BaudGeneratorAcc[BaudGeneratorAccWidth];

疑问如下:
Instead of "2000000/115200", let's use "1024/59" = 17.356.
近似的时候为什么选择了1024 ?
然后累加器就用了十位的,
25M的时候 又近似的多少呢? 65535? 然后用了16位的?
我是想知道这个近似是怎么确定的?
还是只要精度够 就没必要纠结是多少?
这点并没有介绍?

望大家有这方面经验的朋友不吝点拨~~
此帖出自FPGA/CPLD论坛

最新回复

有结果了吗?我现在也在思考这个问题,能解答下吗?   详情 回复 发表于 2024-11-19 21:33
点赞 关注(1)
 

回复
举报

167

帖子

1

TA的资源

一粒金砂(中级)

沙发
 
亲爱的大家一点儿想法也没有么~~~~,,,求教求教~~~
此帖出自FPGA/CPLD论坛
 
 

回复

167

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
代码倒是很好使 吼吼
此帖出自FPGA/CPLD论坛
 
 
 

回复

167

帖子

1

TA的资源

一粒金砂(中级)

4
 
本帖最后由 aibing 于 2014-11-30 21:21 编辑

自说自话吧...这是modelsim里的仿真图大致计算了下25M晶振下,1s计115207次,误差在0.006%,满足串口波特率误差容忍范围

1.jpg (55.97 KB, 下载次数: 0)

Modelsim仿真图

Modelsim仿真图
此帖出自FPGA/CPLD论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

5
 

有结果了吗?我现在也在思考这个问题,能解答下吗?

此帖出自FPGA/CPLD论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表