- /***************** 程序说明 **************************************************
- 功能:波特率发生模块
- 描述:
- <blockquote>在收到来自接收模块或者发送模块的启动信号
- baud_start后,启动波特率计数器 产生9600的比特率端口:clk:50Mhz时钟输入,
- Pin23; rst_n: 复位,低电平有效,
- Pin144;mid_flag: 接收/发送数据标志位,接收或者发送数据位的中间采样点baud_start: 波特率启动标志位;
- 波特率计算:eg:9600bps=9600bit/s9600bit/s=9600bit/1000 000us,那么传输每bit要1000 000/9600us,而一个时钟周期位0.02us,
- 由此可计算出 1000 000/9600us有多少个0.02us,即多少个时钟,计算得:传输每bit要5208个时钟周期,计数从0到5207;
- *****************************************************************************/
- module baud_select(clk,rst_n,baud_start,mid_flag);
- input clk;
- input rst_n;
- input baud_start;
- output mid_flag;
- parameter bps9600=5207, //波特率为9600bps
- //bps19200= 2603, //波特率为19200bps
- //bps38400= 1301, //波特率为38400bps
- //bps57600= 867, //<font face="宋体">波特率为57600bps
- //bps115200= 433; //波特率为115200bps
- //parameter bps9600_2= 2603,
- //bps19200_2= 1301,
- //bps38400_2= 650,
- //bps57600_2= 433,
- //bps115200_2=216;
- `define BPS_PARA 5207
- `define PS_PARA_2 2603
- //***************************************************************************波特率分频计数器,当启动信号标志位为1时计数开始**********//
- reg[12:0]cont;
- always @(posedge clk or negedge rst_n)
- if(!rst_n)cont<= 13'd0;
- else if((cont==`BPS_PARA)||!baud_start)cont<= 13'b0_0000_0000_0000;
- else cont<=cont+1'b1;
- align="left">
- //*********************************************************************
- 发送一个位需要5028个时钟周期,在一个数据位中间时刻,即计数到2603时,接收或发送
- 标志位置,并传输给接收模块或者发送模块,以发送或接收数据;*********//
- mid_flag_1;
- always @(posedge clk or negedge rst_n)
- if(!rst_n)mid_flag_1<=1'b0;
- else if((cont==`BPS_PARA_2))mid_flag_1<=1'b1;
- else mid_flag_1<=1'b0;
- assign mid_flag=mid_flag_1;
- /***************************************************************************/*
- endmodule
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>