FPGA串口收发(四):接收数据并转发,间隔时间发送

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

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(
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值