FPGA串口收发(四):接收数据并转发,间隔时间发送
// Description: 串口收发:串口接收数据,内部生成数据,串口间隔特定时间发送数据
// 串口接收数据:串行信号线 1101_1000 ,转为并行数据,取反截取低4位 传递给led,再传递给data_gen,
// 发送数据: 0.1ms生成/发送一位数据,发送字符串"==HELLO WORLD=" (对应ASCII码),以及led值
1、源文件
uart_rx.v
uart_tx.v
uart_data_gen.v
uart_top.v
uart_data_gen.v
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: Myminieye
// Engineer: Nill
//
// Create Date: 2019-08-20 14:36
// Design Name:
// Module Name: uart_data_gen
// Project Name:
// Target Devices:
// Tool Versions:
// Description: 产生的数据,用于串口发送
// 字符串"====HELLO WORLD==="
// 每秒1s产生一个字符,有可能再加上串口接收的数据( write_max_num 比8'h14 大时)
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
`define UD #1
module uart_data_gen #(
parameter CLK_CNT_1S = 26'h0FA0 //定义参数,计数次数
//晶振40MHz,1s需要计数的 40M次 = 40*10^6 = 0x2625A00
//parameter clk_cnt = 26'h2625A00;
)
(
input clk,
input rst_n,
input [7:0] read_data,
input tx_busy,
input [7:0] write_max_num, //字符串长度,发送的最大字符数 8'h14(20个)
output reg [7:0] write_data, //生成的数据,传出给到串口发送模块 uart_tx
output reg write_en //开始生成数据,传递给uart_tx模块,开启串口发送状态tx_en
);
//==========================================================================
//wire and reg 定义:信号与参数
//==========================================================================
reg [25:0] time_cnt=0; //计数次数,记到26'h2625A00
reg [ 7:0] data_num; //8位数字,位数
// 设置串口发射工作区间
reg work_en=0;
reg work_en_1d=0;
//==========================================================================
//内部信号触发,生成数据使能 work_en :1s计时, 每秒产生一个字符
//==========================================================================
//计数递增,与计数截止的if分开
always @(posedge clk)
begin
time_cnt <= `UD time_cnt + 26'd1;
end
//============ work_en使能,开始生成数据:内部计时1s, ============
//计数时间到,work_en生成数据使能,一个字符串/每秒
always @(posedge clk)
begin
if(time_cnt == CLK_CNT_1S) //计数到1s
//if(time_cnt == 5'd2048)
work_en <= `UD 1'b1; //开始生成数据
else if(data_num == write_max_num-1'b1)//第19个字符
work_en <= `UD 1'b0; //生成数据结束
end
//生成数据使能,打一拍:work_en_1d比work_en,慢一拍
//计时刚到1s,work_en为1,work_en_1d为0
always @(posedge clk)
begin
work_en_1d <= `UD work_en;
end
//==========================================================================
//外部信号触发:串口发送模块接触忙碌,获取tx_busy的下降沿
//==========================================================================
//===========发送寄存器,输入状态 tx_busy_f :忙->空闲============
//获取tx_busy的下降沿,从忙变成不忙:1变成0
reg tx_busy_reg = 0;
wire tx_busy_f;
//发送忙状态,打一拍
always @ (posedge clk)
tx_busy_reg <= `UD tx_busy;
//tx_busy_f,下降沿fall
assign tx_busy_f = (!tx_busy) && (tx_busy_reg);
//==========================================================================
//内部信号和外部信号,综合触发
//1、内部状态,触发产生数据动作:write_pluse 高有效,每秒产生一个字符
//2、外部状态,write_pluse -> write_en -> 输出,触发串口发送
//==========================================================================
//===============触发信号:产生数据 & 发送数据==================
/*
@功能1: 计时刚到1s,可以发送,字符串的下一个数据,给出触发信号
(若发送状态机没走完,还是忙,等走完再发送)
@数据流1: work_en + work_en_1d -> write_pulse(data_gen) -> write_en(data_gen) -> tx_en(top) -> tx_pulse(uart_tx)
@功能2: (计时1s多)解除忙状态,执行发送,字符串的下一个数据,给出触发信号
@数据流2: tx_busy -> tx_busy_f -> write_pulse(

本文介绍了一种基于FPGA的串口收发设计,包括串口接收数据的处理和串口间隔特定时间发送数据的功能。设计通过UART模块实现串行数据的接收和发送,其中接收的数据被转换为并行格式并进行处理,同时内部生成数据并在指定时间间隔通过串口发送。
最低0.47元/天 解锁文章
1878





