首页 > 其他分享 >串口发送数据

串口发送数据

时间:2024-09-05 23:48:30浏览次数:16  
标签:tx clk send rst 模块 串口 发送数据 input

一、这是一篇描述怎么用串口发送数据的文章

1.设计思想稍微介绍一下

个项目想要完成的效果是:每隔10ms ,用串口发送一次数据。
前一个项目完成了如何用串口发送8bit,这个项目是在前一个的基础上,写一个涵盖它的大模块。大模块把send_en、data信号传给子模块,子模块有了激励信号(而不用写这两个信号在tb文件里),串口模块里面就可以正常工作了。

这样使用双层模块,就可以将之前的模块利用起来,只发送uart_tx,相当于做了一层包装。

2.端口介绍

大模块涵盖下面的端口 ↓

input sys_clk,
input rst_n,
output uart_tx

子模块涵盖下面的端口 ↓

input sys_clk         ,          
input rst_n           ,          
input [2:0] time_set  ,   //基础计数器的设置       
input [7:0] data      ,          
input send_en         ,          
output reg uart_tx    ,          
output reg tx_done  

这是之前串口发送8bit的模块,这个模块在这次的项目中称作子模块。子模块中有两个输出,5个输入。在之前的项目中,子模块的三个输入 是在tb文件里面写成了激励信号

input [2:0] time_set  , 
input [7:0] data      , 
input send_en         , 
    • 所以现在的大模块,把要send_en、data写好。
    • 又因为需要一个10ms计时器,所以需要再写一个cnt_10ms。
    • 总共三个模块要在大模块里写完:send_en、data、cnt_10ms

二、代码

(米娜桑只是字母多而已,一点也不复杂,给自己点信心)

1. 大模块设计代码

module byte_send(
input sys_clk,
input rst_n,
output uart_tx
);

reg [7:0] data        ;
reg send_en           ;
wire tx_done          ;

send_byte s1(   
.sys_clk      (sys_clk )   ,
.rst_n        (rst_n   )   ,
.time_set     (2)   ,
.data         (data    )   ,//之前是在tb文件里面给data,send_en,现在是在顶层模块给                            
.send_en      (send_en )   ,//顶层模块就是负责给子模块赋值的
.uart_tx      (uart_tx )   ,
.tx_done      (tx_done) 
);
/*--------------变量的声明-------------------*/
reg [31:0] cnt_10ms;
parameter time_10ms = 500_000;
/*-------------- 1 0 ms ---------------*/
always @(posedge sys_clk or negedge rst_n) begin
    if (!rst_n) begin
        cnt_10ms<=0;
    end
    else if (cnt_10ms==time_10ms-1) begin
        cnt_10ms<=0;
    end
    else
        cnt_10ms<=cnt_10ms+1;
end
/*--------------send_en--------------*/
always @(posedge sys_clk or negedge rst_n) begin
    if (!rst_n) begin
        send_en<=0;
    end
    else if (cnt_10ms== 1) begin
        send_en<=1'b1;
    end
    else if (tx_done) begin
        send_en<=0;
    end
    else
        send_en<=send_en;
end
/*--------------data--------------*/
always @(posedge sys_clk or negedge rst_n) begin
    if (!rst_n) begin
        data<=0;
    end
    else if (tx_done) begin
        data<=data+1;
    end
    else
        data<=data;
end
endmodule

2. 子模块设计代码

module send_byte (                           
input sys_clk         ,          
input rst_n           ,          
input [2:0] time_set  ,   //基础计数器的设置       
input [7:0] data      ,          
input send_en         ,          
output reg uart_tx    ,          
output reg tx_done  
    );
/*-----------------------变量的声明-----------------------------*/
reg [31:0] cnt;//基本计数器
reg [3:0] cnt2;//2级定时器 
reg [31:0] time_cnt;

/*-----------------------设置时间间隔-----------------------------*/ 
always@(*)
if(!rst_n)
    time_cnt<=434;
else
    case(time_set)  
        0:time_cnt<=10416;                 //4800; 
        1:time_cnt<=5208;                  //9600; 
        2:time_cnt<=434;                   //115200;
        default:time_cnt<=434;             //115200;
    endcase
/*-----------------------基本计数器-----------------------------*/
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
    cnt<=32'd0;
else if(send_en)
    if(cnt==time_cnt-1)
        cnt<=32'd0;
    else
        cnt<=cnt+1;
else//!send_en
    cnt<=32'd0;     
/*-----------------------2级计数器-----------------------------*/
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
    cnt2<=4'd0;//默认发start位
else if(send_en)begin
    if((cnt2>=0)&&(cnt2<10))begin
        if(cnt==time_cnt-1)
            cnt2<=cnt2+1;
        else  
            cnt2<=cnt2;
     end
     else if(cnt2==10)
        cnt2<=0;//cnt2的清零
     else  
            cnt2<=cnt2;
end
else //!send_en
    cnt2<=4'd0;
/*-----------------------uart_tx-----------------------------*/
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
    uart_tx<=0;
else if(send_en)
    case(cnt2)
        0: begin uart_tx<=0;  end                        
        1:  uart_tx<=data[0] ;                  
        2:  uart_tx<=data[1] ;                  
        3:  uart_tx<=data[2] ;                  
        4:  uart_tx<=data[3] ;                  
        5:  uart_tx<=data[4] ;                  
        6:  uart_tx<=data[5] ;                  
        7:  uart_tx<=data[6] ;                  
        8:  uart_tx<=data[7] ;                  
        9:  uart_tx<=1 ;       
        default:uart_tx<=1;    
      endcase
else//!send_en
    uart_tx<=uart_tx;                                          
/*-----------------------tx_done-----------------------------*/
always@(posedge sys_clk or negedge rst_n)
if(!rst_n)
    tx_done<=0;
else if(cnt2==9 && cnt == time_cnt-1)                                    
        tx_done<=1;     
else if(send_en)
        tx_done<=0;                
else
        tx_done<=0;
endmodule          
                               

3. 仿真代码

`timescale 1ns/1ps
module tb ;
reg  sys_clk;
reg  rst_n;  
wire uart_tx ;

byte_send b1(
. sys_clk(sys_clk),
. rst_n  (rst_n  ),  
. uart_tx(uart_tx) 
);
/*-----------------sys_clk-----------------*/
initial 
    sys_clk=0;
    always #10 sys_clk=~sys_clk;
/*-------------------rst_n-----------------*/
initial begin
    rst_n=0;
    #201
    rst_n=1;
    #500_000_0;
    $stop;
end 


endmodule

三、仿真现象

可以看出:send_en的周期是10ms ✓


可以看出:tx_done持续了20ns

可以看出:uart_tx也的确是10——先开头拉低一位,紧接着是:低高低高低低低低,先从低位开始发的,所以对应2进制数字是:0000_1010;

现在我的好多同学都在考研,我一直想找个研究fpga的工作,最近在做简历,投了很多公司,但是没有音讯还,我想多多练习口语,加油,我可以是一个好牛马的

标签:tx,clk,send,rst,模块,串口,发送数据,input
From: https://www.cnblogs.com/hfhfhfffhh/p/18398736

相关文章

  • 浏览器串口助手插件,web版本串口调试助手浏览器插件 Web Serial Online 发布
    WebSerialOnline:串口调试的新时代在数字化不断进步的今天,开发者和工程师面对单片机如ESP8266、ESP32以及RS485设备的调试任务时,往往需要便捷而高效的工具。我们最近推出的浏览器插件——WebSerialOnline,旨在简化这一流程,提供一个无缝且直观的解决方案。即插即用的高效工具......
  • STM32 VCP串口通信 浮点数printf打印的问题 保姆级教程
    各位,我最近用STM32G474,设计一个电机驱动的电路。其中ADC采样供电电压,结果是个浮点数,想用printf打印出来看看。然而,电脑上都是USB的接口,没有串口,不想接USB转串口的芯片的话,就将STM32的USB直接配置成VCP(virtualCommunicationPort),那么,电脑就直接将USB识别为串口,直接用printf......
  • 什么是串口服务器?
    1.什么是串口服务器?        了解串口服务器之前,我们需要先了解什么串口。串口:又叫串行数据接口,主要是用来表示传递各种的数据的通信接口,通常指COM口。一般分为RS232、RS422、与RS485三种。RS232接口:采用全双工方式传输,传输距离约为15m。RS422接口:采用全双工方式传输......
  • 1001-基于51单片机LCD液晶显示器的8路抢答器(8路,串口,LCD1602)原理图 仿真 源代码
    1001-基于51单片机LCD液晶显示器的8路抢答器(8路,串口,LCD1602)原理图仿真源代码功能描述:8路抢答器1、提前抢答视为违规抢答,蜂鸣器提示2、A机为选手按钮控制,B机为主持人控制。双机通过串口通信3、可设置抢答时间:10s,20s,30s,40s4、LCD显示抢答过程有哪些资料:1、仿真工......
  • 家庭能源网关开发历程(三)JSY-MK-163串口中断发送接收
     前言        大家好,我是菜菜,在上一期我们主要介绍了关于JSY-MK-163串口通讯配置流程。由于上期没有打印结果,我怕有一些小伙伴还是不懂,本期我们就来实现项目主控MCU华大HC32F005的UART中断发送和接收数据的结果打印。首先,我们先看看用到UART的那些功能函数。UART功......
  • 关于GD32F450ZG系列板卡对RS232发送数据前后不匹配
            先说一下问题,在Keil5开发环境下对板卡上的RS232串口进行配置,要求发送0x5A一笔数据,但实际在串口调试助手中收到0xEC0xF3两笔数据,前后发送的数据不匹配。    针对这个问题,对一下几点重新检查,并确保无误:    1、检查引脚使能情况;    ......
  • 基于Keil软件实现串口收发HEX数据包(江协科技HAL库)
    ​串口收发HEX数据包实验是基于江协科技STM32的HAL库工程模板创建的(可以在作品“基于江科大STM32创建的HAL库工程模板”中的结尾处获取工程模板的百度网盘链接)复制“OLED显示”的工程文件——“4-1 OLED显示屏”,并命名为“9-3 串口收发HEX数据包 ”。打开工程,把下面的程序......
  • 小尺寸BLE 5.2低功耗串口透传蓝牙模块 - ANS-BT103M
    ANS-BT103M是安朔科技自主开发的一款小尺寸BLE蓝牙5.2模块,它支持HID、GATT、ATT和其他配置文件,使用UART作为编程接口,用户可以使用AT命令通过UART读取或写入模块的配置,支持空中升级。支持蓝牙主从一体,一对多连接,透传速率可达60KB/s,支持定制开发。产品参数:模块型号      ......
  • 【北京迅为】龙芯iTOP-LS2K0500开发板快速启动手册-第3章 Windows安装串口终端
      LS2K0500采用龙芯2K0500处理器,基于龙芯自主指令系统(LoongArch)架构,片内集成64位LA264处理器核。实现ACPI、DVFS/DPM动态电源功耗管理等低功耗技术,支持多种电源级别和唤醒方式,可根据具体应用场景对芯片部分功能和高速接口进行动态时钟、电源开关控制,满足工控、网......
  • STM32学习记录-08-USART串口
    1通信接口        通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统        通信协议:制定通信的规则,通信双方按照协议规则进行数据收发                USART:TX数据发送、RX数据接收        I2C:SCL时钟、SDA数据  ......