1.不使用状态机
在UART接收时,采集一帧数据的中间8位有效位,忽略开始位与停止位;在UART发送时,将发送的并行8位数据转为串行数据,并添加开始位与停止位。
UART中的一帧数据为10位,空闲时均为高电平,在检测到开始位(低电平)之后,开始采集8位有效数据位(低位在前),再将停止位置为高电平即可。
代码如下:
1 /*波特率计数*/
2 module bsp_gen(
3 input wire sclk,
4 input wire rst_n,
5 input wire en,
6 output reg tr_data, //中点标志
7 output reg [3:0] num //发送接受的计数位数
8 );
9
10 parameter DIV_CNT = 13'd5207;//50Mhz/9600
11 reg [12:0] cnt;
12 reg flag;
13 //数据中心点进行采样
14 always @(negedge rst_n or posedge sclk) begin
15 if (!rst_n)
16 tr_data <= 1'b0;
17 else if(cnt == (DIV_CNT‐1)/2)
18 tr_data <= 1'b1;
19 else
20 tr_data <= 1'b0;
21 end // always
22
23 always @(negedge rst_n or posedge sclk) begin
24 if (!rst_n)
25 cnt <= 13'd0;
26 else if(flag == 1'b1 && cnt < DIV_CNT)
27 cnt <= cnt + 1'b1;
28 else
29 cnt <= 13'd0;
30 end // always
31
32 always @(negedge rst_n or posedge sclk) begin
33 if (!rst_n)
34 flag <= 1'b0;
35 else if(en)
36 flag <= 1'b1;
37 else if(num == 4'd10)
38 flag <= 1'b0;
3