uart收发实现

本文介绍了UART通信中不使用状态机的方式实现收发。在接收时,关注8位有效数据,忽略开始位和停止位;发送时,将8位并行数据转换成串行数据,并添加开始和停止位。通过这种方式,简化了UART通信的实现过程。
摘要由CSDN通过智能技术生成

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
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的Verilog代码实现UART收发功能: ```verilog module uart ( input clk, input rst_n, input rx, output reg tx, input [7:0] data_in, output [7:0] data_out ); // 定义常量 parameter BAUD_RATE = 9600; // 波特率 parameter CLK_FREQ = 50000000; // 时钟频率 parameter BIT_TIME = CLK_FREQ / BAUD_RATE; // 位时间 // 定义状态机状态 parameter IDLE = 2'b00; parameter START = 2'b01; parameter DATA = 2'b10; parameter STOP = 2'b11; // 定义寄存器 reg [3:0] state_reg; reg [7:0] shift_reg; reg [3:0] bit_cnt_reg; reg [23:0] baud_cnt_reg; // 初始化寄存器 initial begin state_reg = IDLE; shift_reg = 8'd0; bit_cnt_reg = 4'd0; baud_cnt_reg = 24'd0; end // 状态机 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin state_reg <= IDLE; shift_reg <= 8'd0; bit_cnt_reg <= 4'd0; baud_cnt_reg <= 24'd0; end else begin case (state_reg) IDLE: begin if (!rx) begin state_reg <= START; baud_cnt_reg <= 1; end end START: begin if (baud_cnt_reg == BIT_TIME) begin baud_cnt_reg <= 0; state_reg <= DATA; bit_cnt_reg <= 0; shift_reg <= 8'd0; end else begin baud_cnt_reg <= baud_cnt_reg + 1; end end DATA: begin if (baud_cnt_reg == BIT_TIME) begin baud_cnt_reg <= 0; if (bit_cnt_reg == 7) begin state_reg <= STOP; end else begin shift_reg <= {shift_reg[6:0], rx}; bit_cnt_reg <= bit_cnt_reg + 1; end end else begin baud_cnt_reg <= baud_cnt_reg + 1; end end STOP: begin if (baud_cnt_reg == BIT_TIME) begin baud_cnt_reg <= 0; state_reg <= IDLE; data_out <= shift_reg; end else begin baud_cnt_reg <= baud_cnt_reg + 1; end end endcase end end // 发送数据 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin tx <= 1; end else begin case (state_reg) IDLE: begin tx <= 1; end START: begin tx <= 0; end DATA: begin tx <= shift_reg[0]; shift_reg <= {shift_reg[6:0], 1'b0}; end STOP: begin tx <= 1; end endcase end end // 接收数据 assign data_in = data_out; endmodule ``` 上述代码实现了一个简单的UART模块,包括数据发送和接收。具体实现细节请参考代码注释。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值