凔海笔记之FPGA(八):Verilog描述RS232 UART

在我看来,有些代码会用,但未必理解,有些代码理解,但未必会写,有些代码会写,但未必能用自己的话说出来。当能够以自己的想法深入浅出的讲解所学知识,那也就可以说自己掌握了,所以,我还是来发帖吧。

记得刚用单片机学习串口通讯的时候,我以为串口通讯=uart=RS232。o(╯□╰)o
直到最近我才明白
    串口通讯(Serial Communication):是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式,就是一类通讯方式。
    UART(Universal Asynchronous Receiver and Transmitter):通用异步收发器(异步串行通信口),是一种通用的数据通信协议,它包括了RS232、RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。
    RS232:COM口是PC(个人计算机)上,异步串行通信口的简写。由于历史原因,IBM的PC外部接口配置为RS232,成为实际上的PC界默认标准。所以,现在PC机的COM口均为RS232。
    这里所说的串口通讯,准确的说,应该是RS232 UART串口通讯,说白了,它就是一种数据传输的方式,一次能发送或接收一串数据。
    首先,我们要了解下这个协议。
    RS232 UART串口通讯就是将传输数据的每个字符一位接一位地按照一定时间间隔传输,这个数据是被包装起来的,首先,由起始位(0)+八位数据+奇偶校验+停止位构成。
那个一定的时间间隔称之为波特率,波特率就是发送一位所用的时间,在发送的时候,每一位的发送都是在这个时间段内的。
    如果波特率为9600,也就是每秒发送9600个数据,这样的话发送一个数据的时间就是1÷9600=0.0001041667s=104166ns我们晶振是50MHZ,则始终周期是20ns,所以奇数个数为104166÷20=5208.所以,当我们在计数5208过程中要完成一位数据的传输,但为了保险起见,我们在这个数的中间进行传输,也就是2604时一位发送数据。
    起始位:顾名思义,就是开始发送数据的标志位。当我们检测到X电平时,则是起始位,然后就可以发送八位数据了。
    奇偶校验:如果发生的数据为计数,则置1,否则为0,但这并不能精准的检测是否发送正确,所以,既不能精准,便是无用,置一置零看你心情了,
    停止位:如果为高电平,则发送数据完成且正确,反之,你懂得。

通过Verilog描述RS232的串口通讯,那怎么描述嘞,这就需要我们写写画画了。首先,要产生波特率,如果我们用9600bps,也就是以每104166ns发送一个字节的方式把11个数据发送给PC机,然后通过串口助手接收发来的数据。其实就是来个分频模块,其次要实现数据的发送,就是发送数据,那发送的数据从哪来呢,所以再来个数据源模块,它来控制数据的发送。综上,我们要建立三个模块分别完成波特率的产生,数据的发送,还有控制它们的工作。
波特率的产生模块命名为pbs_module.v
数据发送命名为tx_module
控制数据的发送命名为ctrl_module
首先,先描述三个模块的沟通吧

pbs_module.v“生产”9600波特率,每计数5 208完成一个数据的发送,但是,为了保险起见,我们再计数到2604就发送一个数据。所以assign pbs_ctrl_sig = (pbs_cnt == pbs_half) ? 1'b1 : 1'b0;当pbs_ctrl_sig=1则开始数据的发送
例如:
发送起始位:
        4'd0:
        if(pbs_ctrl_sig)
            begin
            tx <= 1'b0;
            i <= i + 1'b1;
            end
但是,不能说pbs_ctrl_sig=1我们就发送数据,那样的话容易乱套,所以我们还需要start_sig信号tx_module.v模块和pbs_module.v模块同时干活,注意是同时干活,这样保证了不会出错。
当数据发送完后,再来个完成信号告诉ctrl_module活干完了,这样,该模块就会不让波特率计数,更不让数据发送
else if(ctrl_sig)
        begin
        start <= 1'b0;
        t_data <= 8'h32;
        end
歇息1s再干活。
    else if(cnt == T1S)
        start <= 1'b1;

上面所说的是数据的发送,那么接收呢?也是类似的。先发送起始位,也就是0,接着接收八位数据,最后是奇偶校验位和停止位。所以了,先检测到低电平是否产生,然后在接收数据。
对于起始位的检测采用边沿检测法,在闲暇时,它一直都是高电平,当检测到低电平后又检测到高电平,这说明起始位来了,所以,要检测到低电平而后又转为高电平,就是起始位。
always @ (posedge clk or negedge rst_n)
    if(!rst_n)
        begin
        begin_sig_1 <= 1'b1;
        begin_sig_2 <= 1'b1;
        end
    else
        begin
        begin_sig_1 <= rx_pin;
        begin_sig_2 <= begin_sig_1;
        end
        
assign rx_begin = begin_sig_2 & ~begin_sig_1;
起始位的检测,使产生bps的模块开始工作,当
assign pbs_ctrl_sig = (pbs_cnt == pbs_half) ? 1'b1 : 1'b0;
为1的时候,采集一位数据,
        4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8,4'd9:
        if(pbs_ctrl_sig)
        begin
        rx_data[i-2] <= rx_pin; 
        i <= i + 1'b1;
        end
       同样,低位在前,高位在后。
       至于奇偶校验位和停止位,咱就这样对待吧,没啥用呀。
        4'd10:
        if(pbs_ctrl_sig)
        i <= i + 1'b1;
        
        4'd11:
        if(pbs_ctrl_sig)
        begin
        i <= 4'b0;
        ctrl <= 1'b0;
        end

最后,有没有发现,我们发送方式是
        起始位(0)+八位数据+奇偶校验+停止位
        接收方式还是
        起始位(0)+八位数据+奇偶校验+停止位
        先发送给PC机的,PC机就先发送给下位机,也就是先进来的现出去。这个就是FIFO。做项目的时候总是用到这玩意。

学识浅薄出拙文,如察错误望赐教,小弟在此感涕零。

欢迎观看更多相关内容:

凔海笔记之FPGA(一):我和我的FPGA

凔海笔记之FPGA(二):聊聊FPGA的内部结构_上

凔海笔记之FPGA(三):聊聊FPGA的内部结构_下

凔海笔记之FPGA(四):Verilog HDL语法简单述

凔海笔记之FPGA(五):(基本|| 组合)逻辑

凔海笔记之FPGA(六):二进制的加法番外篇

凔海笔记之FPGA(七):触发器和锁存器

近期精彩内容推荐:

整流杂谈(一)

整流杂谈(二)

整流杂谈(三)

整流杂谈(四)

(0)

相关推荐

  • UART

    一.串口的历史 首先,串口对每一个做硬件和嵌入式软件的人来说,就是一个必备的工具,调试一个带MCU或者CPU的系统.我们在调试的过程中,一般第一件事情:GPIO点灯,第二件事就是打通串口. 串口是一种 ...

  • UART通信简介

    UART通信简介

  • 接口IIC

    接口IIC

  • 一天一个设计实例-3万字讲解UART和实例

    用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART.它将要传输的资料在串行通信与并行通信之间加以转换.作为把并行输入信号转成串 ...

  • I2C接口与SPI和UART接口的区别

    一.SPI I2C UART通信速率比较: SPI > I2C > UART 1.同步通信>异步通信; 2.同步通信时必须有一根时钟线连接传输的两端; 3.都是串行通信方式,并行通信 ...

  • 凔海笔记之FPGA(九):Verilog描述IIC单字节读写协议

    一.简介AT24C04 AT24C04是小容量(4KB)IIC总线EPROM存储元件.这句话说得很有内容呀.首先,AT24c04是存储元件,还是EPROM即可擦写可编程只读存储器,而且断电可保存.其次 ...

  • 凔海笔记之FPGA(四):Verilog HDL语法简单述

    在百度百科中,是这样介绍Verilog HDL的,它是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表 ...

  • 凔海笔记之FPGA(十一):SDRAM

    对于SDRAM,就以以下四个方面来写下自己的笔记吧 1.初探存储器 2.对SDRAM的认识 3.Verilog综合的SDRAM单字节读写时序 4.多字节读写和页读写 嗯,就这样 下图这个,学过数电的都 ...

  • 凔海笔记之FPGA(十):玩一玩DS1302

    现在这日子过得,一周四节课,没有考试没有作业更没有实验课,真不知道说什么好,还是来说说DS1302吧.(- ̄▽ ̄)-            它生有八脚,电源分主备,晶振有要求,时序有讲究,可记年月日, ...

  • 凔海笔记之FPGA(七):触发器和锁存器

    大多数数字系统中,除了需要具有逻辑运算和算数功能的组合逻辑电路外,还需要具有存储功能的电路,组合逻辑与时序逻辑可构成时序逻辑电路,简称时序电路.现在讨论实现存储功能的两种逻辑单元电路,即锁存器和触发器 ...

  • 凔海笔记之FPGA(五):(基本|| 组合)逻辑

    与门电路:有0则为0 与门(英语:AND gate)又称"与电路".逻辑"积".逻辑"与"电路.是执行"与"运算的基本逻 ...

  • 凔海笔记之FPGA(一):我和我的FPGA

    "老师,单片机那个试验箱都弄完了,接下来我想学学arm" "噢,那挺好的,要不你先学学FPGA吧,学好了FPGA再接触arm会学得更好些" "FPGA ...

  • 凔海笔记之单片机(五):给按键编个码

    按键通常是一种长常开型按钮开关,例如下图,如果不按动得话它就是断开状态的. 它作为单片机的附属小鬼,主要就是为了让单片机检测出它的状态,然后单片机根据这个状态来干一些事.例如,当按键按下灯亮,当按键按 ...

  • 海厦伤寒论笔记(五八)

    伤寒论第49条辨: 脉浮数者,法当汗出而愈.若下之,身重心悸者,不可发汗,当自汗出乃解.所以然者,尺中脉微,此里虚,须表里实,津液自和,便自汗出愈. 脉象浮数的,照理应当使邪气从汗出而解,假使误用下法 ...