利用状态机(FSM)进行简单的uart串口发送数据

module uart_tx(clk,rst_n,key,txd);

input clk;
input rst_n;
input key;
output reg txd;

reg[3:0] state;
reg[15:0] bit_timer;
wire[7:0] tx_data;
assign tx_data=8‘h5a; 

parameter s_idle=4‘d0;
parameter s_start=4‘d1;
parameter s_bit0=4‘d2;
parameter s_bit1=4‘d3;
parameter s_bit2=4‘d4;
parameter s_bit3=4‘d5;
parameter s_bit4=4‘d6;
parameter s_bit5=4‘d7;
parameter s_bit6=4‘d8;
parameter s_bit7=4‘d9;
parameter s_stop=4‘d10;

always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
    begin
         state<=s_idle;
         bit_timer<=16‘d0;
         txd<=1‘b1;
    end
    else
    begin
        case(state)

        s_idle:
        begin
            txd<=1‘b1;
            if(!key)
            state<=s_start;
            else
            state<=state;
        end

        s_start:
        begin
            txd<=1‘b0;
            if(bit_timer==16‘d5208)
            begin
            state<=s_bit0;
            bit_timer<=16‘d0;
            end
            else
            begin
            state<=state;
            bit_timer=bit_timer+16‘d1;
            end
        end

        s_bit0:
        begin
            txd<=tx_data[0];
            if(bit_timer==16‘d5208)
            begin
            state<=s_bit1;
            bit_timer<=16‘d0;
            end
            else
            begin
            state<=state;
            bit_timer=bit_timer+16‘d1;
            end
        end

         s_bit1:
        begin
            txd<=tx_data[1];
            if(bit_timer==16‘d5208)
            begin
            state<=s_bit2;
            bit_timer<=16‘d0;
            end
            else
            begin
            state<=state;
            bit_timer=bit_timer+16‘d1;
            end
        end

        s_bit2:
        begin
            txd<=tx_data[2];
            if(bit_timer==16‘d5208)
            begin
            state<=s_bit3;
            bit_timer<=16‘d0;
            end
            else
            begin
            state<=state;
            bit_timer=bit_timer+16‘d1;
            end
        end

         s_bit3:
        begin
            txd<=tx_data[3];
            if(bit_timer==16‘d5208)
            begin
            state<=s_bit4;
            bit_timer<=16‘d0;
            end
            else
            begin
            state<=state;
            bit_timer=bit_timer+16‘d1;
            end
        end

         s_bit4:
        begin
            txd<=tx_data[4];
            if(bit_timer==16‘d5208)
            begin
            state<=s_bit5;
            bit_timer<=16‘d0;
            end
            else
            begin
            state<=state;
            bit_timer=bit_timer+16‘d1;
            end
        end

         s_bit5:
        begin
            txd<=tx_data[5];
            if(bit_timer==16‘d5208)
            begin
            state<=s_bit6;
            bit_timer<=16‘d0;
            end
            else
            begin
            state<=state;
            bit_timer=bit_timer+16‘d1;
            end
        end

         s_bit6:
        begin
            txd<=tx_data[6];
            if(bit_timer==16‘d5208)
            begin
            state<=s_bit7;
            bit_timer<=16‘d0;
            end
            else
            begin
            state<=state;
            bit_timer=bit_timer+16‘d1;
            end
        end

         s_bit7:
        begin
            txd<=tx_data[7];
            if(bit_timer==16‘d5208)
            begin
            state<=s_stop;
            bit_timer<=16‘d0;
            end
            else
            begin
            state<=state;
            bit_timer=bit_timer+16‘d1;
            end
        end

         s_stop:
        begin
            txd<=1‘b1;
            if(bit_timer==16‘d5208)
            begin
            state<=s_idle;
            bit_timer<=16‘d0;
            end
            else
            begin
            state<=state;
            bit_timer=bit_timer+16‘d1;
            end
        end

        default:
        begin
        state<=s_idle;
        end

        endcase
    end

end

endmodule
时间: 2024-10-14 11:02:38

利用状态机(FSM)进行简单的uart串口发送数据的相关文章

C#串口通信—向串口发送数据,同步接收返回数据

最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件.经过测试,可以正常使用(不支持多线程调用). 一.Machine类 1.Machine类有一个静态变量,定义如下: private static SerialPort serialPort = null; 2.向串口发送数据,同步接收返回数据的方

串口发送数据——字符串发送与十六进制发送的区别

转自:http://blog.csdn.net/wityy/article/details/8234739 串口发送数据——字符串发送与十六进制发送的区别 在使用串口发送数据时可以选择字符串发送或者十六进制发送,通常情况下我们习惯选用字符串发送数据.关于两者的区别,需要从计算机存储数据的格式说起. 在计算机中,数据是以二进制的形式存储的,例如十进制 1(10)在计算机中用 0000 0001(2)来表示.我们在用串口发送数据的时候首先将待数据转换为对应的ASCII码,然后再将这些ASCII码按照

C#把汉字转换成16进制(HEX)并向串口发送数据

报警器实例:(有发送,无返回获取) 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.IO.Ports; 6 using System.Text.RegularExpressions; 7 using System.Windows.Forms; 8 9 namespace ZKJFJK 10 { 11 /*** 12 报警器语音输

uart串口发送---那些年我们一起玩mini2440(arm9)裸机

Uart工作原理: 数据通信方式为:并行通信与串行通信两种: §并行通信:利用多条数据线将数据的各位同时传送. 它的特点是:传输速度快,是用于短距离通信: §串行通信:利用一条数据线将数据一位位地顺序传送. 特点是通信线路简单,利用简单的线缆就实现通信,低成本,是用于远距离通信.   异步通信: ª异步通信:以一个字符为传输单位,通过两个字符间的时间间隔是不固定的,然而同一字符中的两个相邻位之间的时间间隔是固定的. ª通信协议:是指通信双方约定的一些规则.在异步通讯时,对数据格式有如下约定:规定

stm32串口发送数据复位 第一个数据丢失

http://blog.csdn.net/kevinhg/article/details/40991655 STM32串口发送必须先检测状态,否则第一个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失.换成发送别的数值的数据,如0x06 0x0ff,则接收到0x0ff,0x06丢失.错

进阶项目(3)UART串口通信程序设计讲解

写在前面的话 UART串行接口简称串口,是我们各类芯片最常用的一种异步通信接口,通过串口我们就可以建立起计算机和我们实验板之间的通信和控制关系,也就是我们通常所说的上下位机通信.串口可以说是不同平台互相通信.控制的一个最基本的接口. 项目需求 设计一个UART控制器,当控制器从上位机接收到数据以后,马上将数据输出,发送回上位机,完成“回环测试”.  UART的原理分析 要实现UART通信,首先我们需要用到一个外部的电平转换芯片MAX232,其具体配置电路如下: 注解: MAX232芯片是美信(M

[ZigBee] 7、ZigBee之UART剖析(ONLY串口发送)

综述:USART0和USART1是串行通信接口,它们能够分别运行于异步UART模式或者同步SPI 模式.两个USART具有同样的功能,可以设置在单独的I/O 引脚. 1.UART 模式 UART 模式提供异步串行接口.在UART 模式中,接口使用2 线或者含有引脚RXD.TXD.可选RTS 和CTS 的4 线. UART 模式的操作具有下列特点: ● 8 位或者9 位负载数据● 奇校验.偶校验或者无奇偶校验● 配置起始位和停止位电平● 配置LSB 或者MSB 首先传送● 独立收发中断● 独立收发

关于STM32 USART(串口)发送数据丢失第一帧的真实原因探索

自我介绍 为什么要写个自我介绍?俗话说,光说不练假把式,光练不说傻把式, 因为本人一直很自负,感觉什么东西都可以很快上手(当然非对口专业知识要求高的技能除外),如果我不把这自负表现出来,感觉会憋出内伤. 本人于2015年毕业于电子科技大学,开始的理想是进入一家国外的游戏公司,但理想很丰满,现实很骨感,给育碧.2k Game.Gameloft.EA都投了简历,但都被无情pass掉了(在此吐槽一下,这些公司真的是想在校园里招本科生吗?明明是研究生的计算机图形学却成了这些公司对本科生的要求).后来毕业

2018最新mfc作为上位机接收硬件端USB或串口数据显示成图片 解决串口接收数据丢字节丢包问题

本文用的是VS2013MFC写串口数据接收: 第一步:首先建立一个MFC工程,成功后会跳出一个对话框,直接在对话框上点击右键->点击插入ACTIVAE控件->选择MicrosoftCommunications Control, version 6.0 成功后会显示一个电话的图标在对话框上,运行起来不会显示的 不用担心这个美观问题.如果没有这个插件的话,可能是版本太低  可以自己下载一个补上 第二步:大概的窗体搞好:   那个显示图片的大框是PICTURE控件变量 然后就要项目->类向导中