精华内容
下载资源
问答
  • 计算机上面经常有一个串口COM1, 是232的, 我在做相机硬触发时,再买一个转TTL的电平转换线,这个程序能够用232接口中的RTS线作为脉冲源。
  • 行业分类-电器装置-串口电磁脉冲防护器.zip
  • 测定高速脉冲串的频率速度
  • stm32外部脉冲计数程序,通过产生定量的脉冲个数,然后通过串口读取个数
  • 利用STm32的HAL库,用STM32CubeMX来进行配置,对脉冲进行计数,并显示在TFTLCD上,同时当上位机传来命令后可以将脉冲个数上传到上位机。
  • 32单片机串口打印对外脉冲信号,32单片机串口打印对外脉冲信号
  • 之前,硬件工程师我说:你给我发个脉冲指令,我触发一下。 我:???(黑人问号脸)脉冲指令是什么 他:就是一个点,给我触发一下。 我:????一个点???什么点?你要告诉我发什么指令内容过去啊 他:...

    之前,硬件工程师和我说:你给我发个脉冲指令,我触发一下。

    我:???(黑人问号脸)脉冲指令是什么

    他:就是一个点,给我触发一下。

    我:????一个点???什么点?你要告诉我发什么指令内容过去啊

    他:就是一个点啊,触发一下就好了。

    我:。。。。。。。

     

    找了好几天的资料,终于被我找到了,原来根本不是发什么内容过去,而是更改串口的一个值的属性。。

    DTR触发信号触发,50ms即可。把DtrEnable属性改一下就行了

    serialPort.DtrEnable = true;
    Thread.Sleep(50);
    serialPort.DtrEnable = false; 

    Rts信号也是同理,serialport的属性RtsEnable

    serialPort.RtsEnable=true;

    通讯软件截图

    展开全文
  • vc开发的自行车里程速度表!串口检测脉冲信号,强烈推荐!已经在模拟驾驶应用。bike_speed_switch_test.rar
  • 脉冲信号电平的区别

    千次阅读 2021-11-24 11:04:44
    1.脉冲信号是振荡电路通过自我激励的形式(正反馈),形成一个特殊波形,然后通过非门这样的电路整形后就可以得到脉冲信号了。 2.电平信号就是一种电压信号,它的特点就是在输入不变,供电不变,电路其他参数稳定的...

    1.脉冲信号是振荡电路通过自我激励的形式(正反馈),形成一个特殊波形,然后通过非门这样的电路整形后就可以得到脉冲信号了。

    2.电平信号就是一种电压信号,它的特点就是在输入不变,供电不变,电路其他参数稳定的情况下,某一段时间中,保持一个相对固定的值。


    以下资料来源于网上
    1.脉冲信号简介
    脉冲信号是一种离散信号,形状多种多样,与普通模拟信号(如正弦波)相比,波形之间在时间轴不连续(波形与波形之间有明显的间隔)但具有一定的周期性是它的特点。最常见的脉冲波是矩形波(也就是方波)。脉冲信号可以用来表示信息,也可以用来作为载波,比如脉冲调制中的脉冲编码调制(PCM),脉冲宽度调制(PWM)等等,还可以作为各种数字电路、高性能芯片的时钟信号。
    2.脉冲信号原理
       所谓脉冲信号表现在平面坐标上就是一条有无数断点的曲线,也就是说在周期性的一些地方点的极限不存在,比如锯齿波,也有电脑里用到的数字电路的信号0,1。脉冲信号,也就是像脉搏跳动这样的信号,相对于直流,断续的信号,如果用水流形容,直流就是把龙头一开着淌水脉冲就是不停的开关龙头形成水脉冲。
    3.脉冲信号技术标准
    电打开灯亮,这是直流,不停的开关灯亮、熄,就形成了脉冲,开关速度的快慢就是脉冲频率的高低。
       脉冲信号的传输距离:光电隔离,无源开路输出,传输距离小于500米。
       脉冲信号分为尖脉冲信号与三角波脉冲信号等,可以通过Rc的一阶暂态电路的积分与微分电路实现。
      
      ------------------------------------------------------------------------
    1.电平信号简介
    电平信号是指设备输出信号和输入信号的功率比然后取对数值,通常用P表示,P=lgP2/P1。
    TTL电平信号被利用的最多是因为通常数据表示采用二进制规定,+5V等价于逻辑“1”,0V等价于逻辑“0”,这被称做TTL(晶体管-晶体管逻辑电平)信号系统,这是计算机处理器控制的设备内部各部分之间通信的标准技术。
    TTL电平信号对于计算机处理器控制的设备内部的数据传输是很理想的,首先计算机处理器控制的设备内部的数据传输对于电源的要求不高以及热损耗也较低,另外TTL电平信号直接与集成电路连接而不需要价格昂贵的线路驱动器以及接收器电路;再者,计算机处理器控制的设备内部的数据传输是在高速下进行的,而TTL接口的操作恰能满足这个要求。TTL型通信大多数情况下,是采用并行数据传输方式,而并行数据传输对于超过10英尺的距离就不适合了。这是由于可靠性和成本两面的原因。因为在并行接口中存在着偏相和不对称的问题,这些问题对可靠性均有影响;另外对于并行数据传输,电缆以及连接器的费用比起串行通信方式来也要高一些。
    电平信号就是一种电压信号,它的特点就是在输入不变,供电不变,电路其他参数稳定的情况下,某一段时间中,保持一个相对固定的值。比如数字电路中的,高电平信号,低电平信号等等。
    -----------------------------------------------------------------
    1.电平信号和脉冲信号的产生
    电平信号就是一种电压信号,它的特点就是在输入不变,供电不变,电路其他参数稳定的情况下,某一段时间中,保持一个相对固定的值。比如数字电路中的,高电平信号,低电平信号等等。
      脉冲信号一般是由振荡电路产生的,振荡电路通过自我激励的形式(正反馈),形成一个特殊波形,然后通过非门这样的电路整形后就可以得到脉冲信号了。与电平信号相比,脉冲信号在输入不变的情况下,仍然会发生周期性的变化,比如电平在高低之间不断反复,而且高电平和低电平维持的时间都相对固定。产生这个现象的原因主要就是前面说的那个振荡信号,既然是振荡,肯定有电压的变化(而且往往是周期性变化,比如正弦波)。
      ---------------------------------------------------------------------------------
      1.电平信号和脉冲信号区别
       1、脉冲信号是指信号的波形(在示波器上可以看到)是脉冲。电信号有很多种波形,除了脉冲外,还有正弦波(例如市电就是此种波形),三角波等等。
      2、电平是指信号的大小,与具体波形无关。事实上,任何波形都可以有不同的电平。
      3、同步电平——指同步信号的大小;
      4、同步脉冲——是指加入到某种震荡电路,使振荡器与该信号同步的输入脉冲信号。

    展开全文
  • 基于FPGA的串口控制多通道脉冲设计.pdf
  • 串行接口串口按位(bit)发送接收字节。尽管比按字节(byte)传输的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。 串口通信中比较重要的参数包括波特率、数据位、停止位及校验位,...

    一、串口通信简介

    串口通信,顾名思义也就是利用串行接口进行通信。串行接口指串口按位(bit)发送和接收字节。尽管比按字节(byte)传输的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

    串口通信中比较重要的参数包括波特率、数据位、停止位及校验位,通讯双方需要约定一致的数据格式才能正常收发数据。串行通讯可以进一步分为单工、半双工和全双工三种。在串口通信中,常用的协议包括RS-232、RS-422和RS-485。它们的主要区别在于其各自的电平范围不相同。

    二、串行和并行通信

    刚说到串口通信是通过接口进行串行通讯。那么什么是串行通讯呢?

    1 串行通信:

    串行通信:计算机与I/O设备之间,同一时刻,只能传输一个bit位的信号。传输数据按顺序依次一bit位接一bit位进行传输,通常数据在一根数据线或一对差分线上传输。

    比如,当传输1字节信息时,并行通讯有8根信号线实现同时传输,假如耗时为1T,而串行是在一根信号线上,把数据排成一行、一位一位传输,需要传8次,因此耗时为8T。因此可总结出二者的特性:

    2 并行通信:

    并行通信是和串行通信相对的数据传输的方式。

    并行通信:计算机与I/O设备之间,通过多条传输线,可以同时传输多个bit位的信号。

    • 并行通讯的效率高,但是成本高、对信号线路要求高,一般应用于快速设备之间近距离传输,譬如CPU 与存储设备、存储器与存储器、主机与打印机等都采用并行通讯。

    • 串行通讯效率较低,但是对信号线路要求低,抗干扰能力强,同时成本也相对较低,一般用于计算机与计算机、计算机与外设之间远距离通讯。

    3 串口通信和串行通信的区别

    串口通信和串行通信的区别在于:串行通信是一种概念,串口通信是一种具体的通信手段。

    串行通信是一种概念,是指一比特一比特的收发数据,相对于并行通信可同时传输多个bit位而言。包括一般的的串口通信、I2C、SPI等等。

    串口通信是外设和计算机间的一种通信手段,是相对于以太网通信等通信手段而言的。

    二者一个是一种概念,一个是一种实际的通信方式。

    三、同步和异步通信

    在设备之间传送数据,不管是同步通信还是异步通信,都是为了保证数据被正确的发送和接收,即发送方和接收方的“同步”。即接收方可以确定什么时候发送方开始或者结束发送数据以及每一个数据单位(例如bit,字符)的开始和结束的位置,这样接收方才能在正确的时间对发送方的数据进行采样,以接收正确的数据,否则接收到的数据就是错误的。

    根据“同步方式”的不同,由此分出两种同步信号得方法:
    (1)同步通信(比特位同步)
    (2)异步通信(字符间同步,字符内比特位异步)

    同步通信会利用一根额外的信号线,其实也就是时钟信号线,它往往是发送设备提供的时钟信号,发送设备和接收设备在发送设备提供的同一时钟频率下完成同步。(实际上,基本所有的并行通信采用同步通信。)

    异步通信没有额外的一根信号线用于同步,接收者和发送者使用各自的时钟信号,接收者根据与发送者按事先约定的规来确定数据发送的开始与结束以及数据单位的持续时间。例如异步串行通信中,一般接收双方会确定一致的停止位,数据位的个数、波特率的大小以及是否采用奇偶校验位。接收方可以根据这些信息推测出准确的数据采样时间以接收正确的数据。如果是同步通信则不需要这些额外的用于同步的数据位(开始位,结束位,奇偶校验位)。

    1 同步通信

    同步通信要求发送和接收双方在进行数据传输时,保持完全的同步,因此,要求发收双方必须使用同频同相的同步时钟信号。只需在传送报文的最前面附加特定的同步字符,使发收双方建立同步,此后在同步时钟的控制下逐位发送/接收。这样,信息传输完全可以确定传输过程中每1位的位置。因此同步通信是一种比特同步通信技术。

    如下图所示:
    在这里插入图片描述

    同步通信是一种连续传送数据的通信方式,一次通信传送一帧数据,每个信息帧用同步字符作为开始,字符间不加标识位。(这里的数据帧比异步通信中的字符帧要大得多,通常含有若干个数据字符)。当检测到有一串数位和同步字符相匹配时,就认为开始一个信息帧,于是,把此后的数位作为实际传输信息来处理。

    同步通信以数据帧为单位,其格式包括:同步字符+数据+校验字符CRC。

    (a)单同步数据帧结构

    同步字符数据字符1数据字符2数据字符3数据字符nCRC1CRC1

    (b)双同步数据帧结构

    同步字符1同步字符2数据字符1数据字符2数据字符nCRC1CRC1

    没有数据发送时,接收方要时刻做好接收数据的准备。在每组信息(通常称为帧)传输的开始,发送方先发送一个或两个特殊字符,该字符称为同步字符。当接收方收到同步字符,并和发送方达到同步后,就可以以固定的节奏一个字符接一个字符地发送一大块数据,而不再需要用起始位和停止位了,这样可以明显地提高数据的传输速率。同步通信更加适合对速度要求高的传输,对时序的要求很高,当然对硬件要求也更高。

    在没有信息要传输时,要填上空字符,因为同步传输不允许有间隙。在同步传输过程中,一个字符可以对应5~8位。当然,对同一个传输过程,所有字符对应同样的数位,比如说n位。这样,传输时,收发双方用一个时钟进行协调,按每n位划分为一个时间片,发送端在一个时间片中发送一个字符,接收端则在一个时间片中接收一个字符,这样就可以确定传输中每一位的位置。接收数据时,接收方利用同步字符使内部时钟与发送方保持同步,然后将同步字符后面的数据逐位移入,并转换成并行格式,供CPU读取,直至收到结束符为止。

    2 异步通信

    异步通信是按字符帧传输的,相对于同步通信,异步通信在发送字符时,所发送的字符之间的时隙可以是任意的,接收方并不知道数据什么时候会到达,因此接收端必须时刻做好接收的准备(如果接收端主机的电源都没有加上,那么发送端发送字符就没有意义,因为接收端根本无法接收)。发送端可以在任意时刻开始发送字符,时间间隔可以是任意的,在一字符帧中的所有比特是连续发送的。

    发送端不需要在发送字符之前和接收端进行协调(不需要先进行比特同步)。接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。内部处理器在完成了相应的操作后,通过一个回调的机制,以便通知发送端发送的字符已经得到了回复。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的字符间同步,字符内比特位异步)

    因此必须在每一个字符的开始和结束的地方加上标志,即加上开始位和停止位,以便使接收端能够正确地将每一个字符接收下来。通信双方需要对采用的信息格式(字符的位数、停止位的位数、有无校验位及校验方式等)和数据的传输速率作相同的约定。接收方是在数据的起始位和停止位的帮助下实现字符传送时的同步。这种传输通常是很小的分组,比如一个字符为一组,为这个组配备起始位和结束位。所以这种传输方式的效率是比较低的,毕竟额外加入了很多的辅助位作为负载,常用在低速的传输中。

    在这里插入图片描述
    异步通信以字符为单位,其格式包括:起始位+数据+奇偶校验位+停止位。
    以起止式异步协议为例,如下图所示
    在这里插入图片描述
      起止式异步通信的特点是:一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以"起始位"开始,以"停止位"结束,字符之间没有固定的时间间隔要求。每一个字符的前面都有一位低电平起始位(逻辑值0),字符本身由5-8位数据位组成,接着字符后面是一位校验位(也可以没有校验位),最后是一位或一位半或二位停止位,停止位后面是不定长的空闲位。停止位和空闲位都规定为高电平(逻辑值1),这样就保证起始位开始处一定有一个下跳沿。由此就可以标志一个字符传输的起始。而根据起始位和停止位也就很容易的实现了字符的界定和同步。
      如上图中所示,这种格式是靠起始位和停止位来实现字符的界定或同步的,故称为起止式协议。
      
    (1)起始位:发送数据时,先发持续一个bit时间的逻辑”0”信号,表示字符传输的开始,接收端可根据起始位使自己的接收时钟与发送方的数据同步。

    (2)数据位:起始位后是数据位,异步传送规定低位在前,高位在后,数据位的位数一般可以是5~8位。

    (3)奇偶校验位:奇偶位紧跟在数据最高位之后,占用一位(也可省去)。加上这一位后,使得逻辑“1”信号的位数得到偶校验或奇校验,以此来校验数据传送的正确性。
      如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。举例来说,假设传输的数据位为01001100,如果是奇校验,则奇校验位为0(要确保总共有奇数个1),如果是偶校验,则偶校验位为1(要确保总共有偶数个1)。
      由此可见,奇偶校验位仅是对数据进行简单的置逻辑高位或逻辑低位,不会对数据进行实质的判断,这样做的好处是接收设备能够知道一个位的状态,有可能判断是否有噪声干扰了通信以及传输的数据是否同步。

    (4)停止位:数据发送完后,再发1位、1.5位、2位的高电平(逻辑”1”信号)代表停止位,表示一帧数据结束,同时为接收下一帧数据做准备。

    (5)空闲位:在没有数据发送时,即下一帧的起始位“0”到来之前,数据线保持默认的“1”状态,即由高电平来填充。

    异步通信字符帧格式总结如下表:

    逻辑信号数据位数
    起始位01位
    数据位0或15~8位
    校验位0或11位或无
    停止位11位,1.5位或2位
    空闲位1任意数量

    :位数的本质含义是信号持续的时间,故可有分数位,如停止位1.5位,1.5是它的长度,即停止位的电平保持1.5个单位时间长度。一个单位时间就是波特率的倒数,例如波特率为9600bps,则一个单位时间长为1/9600s,1.5个停止位,即停止位电平保持1.5/9600s。

    3 同步通信和异步通信比较

    (1)同步通信要求接收端时钟频率和发送端时钟频率一致;异步通信时不要求接收端时钟和发送端时钟同步。

    (2)同步通信数据传输是以字节块(多个字节)传输的;异步通信数据传输是以字符(一个字节)传输的。

    (3)同步通信传输效率高,但复杂、要求高,双方时钟的允许误差较小;异步通信传输效率低,但简单、要求低,双方时钟可允许一定误差。

    (4)同步通信的字节传输是没有间隔的发送端发送连续的比特流;异步通信字节传送的间隔是任意的,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。

    同步通信和异步通信的差异总结如下表:

    同步通信异步通信
    传送单位信息帧(由若干字符组成的数据块)字符(由若干bit组成)
    单位格式同步字符+数据+校验字符CRC起始位+数据位+奇偶校验位+停止位
    传送间隔一个数据块(信息帧)内,字符与字符间无间隔相邻两字符之间隔任意长
    时钟信号时序要求高,使用同频同相的时钟线路时序要求较低,使用各自的时钟信号
    优点效率高简单,要求低
    缺点复杂,要求高效率低(传送一个字符,要增加约20%的附加信息位)
    展开全文
  • 硬件接线: A+ GPIOB_Pin_6 B+:GPIOB_Pin_7 A-:GPIOC_Pin_6 B-:GPIOC_Pin_7 串口波特率:9600 设置好这些转动电机就可以在串口上看到当前速度位置,希望对初学者有一定帮助
  • 电子-mini读中断脉冲定时器串口输出.rar,单片机/嵌入式STM32-F0/F1/F2
  • 串行接口(UART)------verilog实现串口接收模块

    万次阅读 多人点赞 2018-11-15 15:08:35
    串行接口(Serial port),主要用于串行式逐位数据传输。常见的有一般计算机应用的RS-232(使用 25 针或 9 针连接器)工业计算机应用的半双工RS-485与全双工RS-422。----------维基百科 按照电气标准划分,串口...

    一、串口基本概念

    串行接口(Serial port),主要用于串行式逐数据传输。常见的有一般计算机应用的RS-232(使用 25 针或 9 针连接器)和工业计算机应用的半双工RS-485全双工RS-422。----------维基百科

    按照电气标准划分,串口可以分为RS-232-C、RS-422、RS-485。

    RS-232-C:也称标准接口,是目前最常用的一种串行通讯接口。台式计算机一般有两个串行口:COM1和COM2,均为9针D形接口通常在计算机后面能看到,一般笔记本上有一个串口,超薄本除外。RS-232-C电气标准接口传输速率低,传输距离近。

    RS-422:为改进RS-232-C传输距离近,传输速率低的特点,RS-422定义了一种平衡通信接口,传输速率提高到10Mb/s,并允许在一条接收总线上挂多个接收器。

    RS-485:为扩展应用范围,EIA又于1983年在RS-422基础上制定了RS-485 标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为 TIA/EIA-485-A标准。

     下图是串口公口实物图,在台式机和笔记本上一般都能找到。维基百科

    串口公口
    图1 串口公口

     2、串口传输时序-------参考【FPGA黑金开发板】Verilog HDL那些事儿--串口模块(十一)

    图2  串口时序

     图2是串口传输数据的时序图,串口总线默认是高电平,一帧数据开始必须先拉低电平,对应图中起始位。串口传输数据是以数据包为单位的,一个数据包有11位,其中先传输起始位,紧接着传输8个数据位,数据位是按照由低到高的顺序进行传输的,接着传输校验位,最后传输停止位。

    串口还有一个重要的参数就是波特率,一般用波特率来形容串口传输数据的速度。常用的波特率有9600bps和115200bps,本文主要介绍9600bps。bps:bit per second,就是每秒钟传输多少位;9600bps就是每秒钟传输9600位,对应的传输一位所用的时钟周期就是9600Hz。接下来本文参考《verilog那些事儿——建模篇》中串口模块的划分来实现串口的接收部分verilog代码。

    3、串口接收分析

    由于这里是串口接收模块的介绍,为简单考虑从串口外部输入的信号只考虑RX_data_in。由于串口接收数据有明显的先后顺序,因此可以使用状态机来描述串口接收数据过程。使用算法状态机描述串口接收过程如下图所示:

     

    图3 算法状态机

    图3中s0状态实现数据的初始化,start信号对应串口发送的起始位数据,使用沿检测电路实现;s2状态是接收8位有效数据状态,由于串口是串行将数据接收进来,然后转成并行数据,因此s1部分的电路可以用右移的移位寄存器实现(串口先发送低位数据,所以选用右移移位寄存器);图中虽然画出了s3状态执行校验功能,但是本代码不考虑检验问题,因此s3状态相当于是空状态;s4状态是串口接收数据完毕发出的标志信号。根据算法状态机可以看出,实现串口的接收所需要的基本电路有移位寄存器电路、计数器电路和触发器电路。

    4、数据路径

    图4 数据路径

     数据路径如图4所示,波特率定时信号的作用分析如下:

    图5 FPGA接收数据过程

     由于FPGA的工作时钟较快,串口发送数据较慢。如图5所示,串口发送一位数据可能占用多个FPGA时钟周期,因此需要增加采样信号sampling_signal,采样信号有效时占一个时钟周期,在采样信号有效时,FPGA才接收数据,保证每位数据只接收一次。波特率定时计数器就是用来产生采样信号的,在波特率定时计数器计数到一定数据后,采样信号有效,否则,采样信号无效,这样就可以产生如图5所示的采样信号。

    5、控制信号

    图6  控制信号

    图6给出了控制信号在哪个状态有效。在s0状态,移位寄存器和计数器加载0,D触发器使能信号en_b有效,检测串口发送的数据rx_pin_in的起始信号,待检测到起始信号后,start信号有效,进入s1状态,在s1状态使能波特率采样计时信号cnt_en,判断串口采样信号sinpling_signal是否有效,若有效,设置计数器使能信号有效,反之,设置计数器使能信号无效;在计数器cnt=1时,进入s2状态,此状态开始接收串口发送的8位数据位,首先使能波特率采样计时信号cnt_en,判断sinpling_signal是否有效,若有效,计数器使能信号和移位寄存器使能信号均设置为有效,反之,设置为无效;待8位数据位接收完毕后,进入s3状态,此时仍然使能波特率采样计时信号cnt_en,判断采样信号sinpling_signal是否有效,若有效,设置计数器使能信号有效,反之,设置无效。待计数器记到10时,进入s3状态,串口发送的11位信号接收完毕标志信号done拉高,此时仍然使能波特率采样计时信号cnt_en,判断sinpling_signal是否有效,若有效设置计数器使能信号有效,反之,设置无效。然后进入s0空闲状态,等待下一次数据接收。

    6、verilog描述

    接下来就可以使用verilog语言描述上述电路:

    module RECEIVE_MODULE(input clk_in,
    							 input rst,
    							 input rx_pin_in,
    							 output [7:0] rx_data,
    							 output reg done,
    							 output clk_50m
        );
    //wire clk_50m;	 
    clk_1 clk_1 (
        .CLKIN_IN(clk_in), 
        .CLKFX_OUT(clk_50m), 
        .CLKIN_IBUFG_OUT(CLKIN_IBUFG_OUT), 
        .CLK0_OUT(CLK0_OUT)
        );
    
    parameter s0 = 'b00001;
    parameter s1 = 'b00010;
    parameter s2 = 'b00100;
    parameter s3 = 'b01000;
    parameter s4 = 'b10000;
    reg[4:0]current_state = 'd0;
    reg[4:0]next_state = 'd0;
    //
    wire start;
    reg en_b;
    reg cnt_en;
    wire simpling_signal;
    reg load_c;
    reg en_c;
    reg en_a;
    reg load_a;
    wire [3:0]count;
    /
    always @(posedge clk_50m or negedge rst)
    	if(!rst)
    		current_state <= s0;
    	else
    		current_state <= next_state;
    /
    always @(*)
    	case(current_state)
    		s0:	begin
    			if(start)
    				next_state = s1;
    			else
    				next_state = s0;
    		end
    		s1:	begin///起始位
    			if(count == 'd1)
    				next_state = s2;
    			else
    				next_state = s1;
    		end
    		s2:	begin///数据位
    			if(count == 'd9)
    				next_state = s3;
    			else
    				next_state = s2;
    		end
    		s3:	begin
    			if(count == 'd10)
    				next_state = s4;
    			else
    				next_state = s3;
    		end
    		s4:	begin
    			if(count == 'd0)
    				next_state = s0;
    			else
    				next_state = s4;
    		end
    		default:next_state = s0;			
    	endcase
    /
    always @(*)
    	case(current_state)
    		s0:	begin
    			en_b = 'd1;
    			load_a = 'd1;
    			load_c = 'd1;
    			cnt_en = 'd0;
    			en_a = 'd0;
    			en_c = 'd0;
    			done = 'd0;
    		end
    		s1:	begin
    			en_b = 'd1;
    			load_a = 'd0;
    			load_c = 'd1;
    			cnt_en = 'd1;
    			en_c = 'd0;
    			done = 'd0;
    			if(simpling_signal)	begin
    				en_a = 'd1;
    			end
    			else	begin
    				en_a = 'd0;
    			end
    		end
    		s2:	begin
    			en_b = 'd0;
    			load_a = 'd0;
    			load_c = 'd0;
    			cnt_en = 'd1;
    			done = 'd0;
    			if(simpling_signal)	begin
    				en_c = 'd1;
    				en_a = 'd1;
    			end
    			else	begin
    				en_c = 'd0;
    				en_a = 'd0;
    			end
    		end
    		s3:	begin
    			en_b = 'd0;
    			load_a = 'd0;
    			load_c = 'd0;
    			cnt_en = 'd1;	
    			en_c = 'd0;
    			done = 'd0;
    			if(simpling_signal)
    				en_a = 'd1;
    			else
    				en_a = 'd0;
    		end
    		s4:	begin
    			en_b = 'd0;
    			load_a = 'd0;
    			load_c = 'd0;
    			cnt_en = 'd1;	
    			en_c = 'd0;
    			done = 'd1;
    			if(simpling_signal)
    				en_a = 'd1;
    			else
    				en_a = 'd0;			
    		end
    		default:	begin
    			en_b = 'd0;
    			load_a = 'd0;
    			load_c = 'd0;
    			cnt_en = 'd0;
    			en_a = 'd0;
    			en_c = 'd0;
    			done = 'd0;
    		end
    	endcase
    // Instantiate the module
    edge_detection edge_detection (
        .clk_50m(clk_50m), 
        .en_b(en_b), 
        .rx_pin_in(rx_pin_in), 
        .start(start)
        );
    // Instantiate the module
    BPS_TIMER BPS_TIMER (
        .clk_50m(clk_50m), 
        .cnt_en(cnt_en), 
        .simpling_signal(simpling_signal)
        );
    // Instantiate the module
    right_shifter right_shifter (
        .clk_50m(clk_50m), 
        .load_c(load_c), 
        .en_c(en_c), 
        .rx_pin_in(rx_pin_in), 
        .rx_data(rx_data)
        );
    // Instantiate the module
    COUNT_NUM COUNT_NUM (
        .clk_50m(clk_50m), 
        .load_a(load_a), 
        .en_a(en_a), 
        .count(count)
        );
    endmodule
    

     边沿检测模块代码:

    module edge_detection(input clk_50m,
    							 input en_b,
    							 input rx_pin_in,
    							 output start
        );
    reg rx_pin_in_1 = 'd0;
    always @(posedge clk_50m)
    	if(en_b)
    		rx_pin_in_1 <= rx_pin_in;
    	else
    		rx_pin_in_1 <= rx_pin_in_1;
    		
    assign start = (!rx_pin_in) & rx_pin_in_1;
    
    endmodule
    

     波特率定时模块代码:

    由于使用的时钟是50mhz的,而串口的波特率是9600bps,即串口发送数据的时钟是9600hz,因此需要使用50mhz的时钟产生个计数器,
    ///使其每1/9600s产生一个允许采样脉冲。
    //计数器大小设置:500*10^3/96 = 5208,\,因此计数器需要计数5208个数,由于在数据中间在中间时刻更稳定,因此,在5208/2=2604时对数据进行采样更准确,
    //由于计数是从零开始,因此在2603时对数据进行采样,数据计数到5207清零。
    //
    module BPS_TIMER(input clk_50m,
    					  input cnt_en,
    					  output simpling_signal
        );
    reg [12:0] cnt = 'd0;
    always @(posedge clk_50m)
    	if(cnt_en)	begin
    		if(cnt == 'd5207)
    			cnt <= 'd0;
    		else
    			cnt <=  cnt + 'd1;
    	end
    	else
    		cnt <= 'd0;
    assign simpling_signal = (cnt == 'd2603)?'b1:'b0;
    endmodule
    

     右移寄存器模块代码:

    //此模块用于将串行发送的数据转成并行接收
    //
    module right_shifter(input clk_50m,
    							input load_c,
    							input en_c,
    							input rx_pin_in,
    							output reg[7:0]rx_data
        );
    always @(posedge clk_50m)
    	if(load_c)
    		rx_data <= 'd0;
    	else if(en_c)
    		rx_data <= {rx_pin_in,rx_data[7:1]};
    	else
    		rx_data <= rx_data;
    endmodule

     计数器模块代码:

    module COUNT_NUM(input clk_50m,
    					  input load_a,
    					  input en_a,
    					  output reg [3:0]count
        );
    always @(posedge clk_50m)
    	if(load_a)
    		count <= 'd0;
    	else if(en_a)	begin
    		if(count == 'd10)
    			count <= 'd0;
    		else
    			count <= count + 'd1;
    	end
    	else
    		count <= count;
    		
    endmodule
    

     仿真激励文件代码:

    module test;
    
    	// Inputs
    	reg clk_in;
    	reg rst;
    	reg rx_pin_in = 'd1;
    
    	// Outputs
    	wire [7:0] rx_data;
    	wire done;
    	wire clk_50m;
    
    	// Instantiate the Unit Under Test (UUT)
    	RECEIVE_MODULE uut (
    		.clk_in(clk_in), 
    		.rst(rst), 
    		.rx_pin_in(rx_pin_in), 
    		.rx_data(rx_data), 
    		.done(done),
    		.clk_50m(clk_50m)
    	);
    
    	initial begin
    		// Initialize Inputs
    		clk_in = 0;
    		rst = 0;
    		rx_pin_in = 1;
    
    		// Wait 100 ns for global reset to finish
    		#100;
    		// Add stimulus here
    
    	end
    	reg clk1= 'd1;
          always #5 clk_in = ~clk_in;
    		
    	reg [15:0]cnt = 'd0;
    	always @(posedge clk_50m)
    		if(cnt>0)
    			rst <= 'd1;
    		else
    			rst <= rst;
    			
    		always @(posedge clk_50m)
    			if(cnt == 'd60000)/'d57287
    				cnt <= 'd0;
    			else
    				cnt <= cnt + 'd1;
    		always @(posedge clk_50m)
    			if(cnt>'d10&&cnt<='d5208)
    				rx_pin_in <= 'd0;//1
    			else if(cnt>='d5208&&cnt<='d10415)
    				rx_pin_in <= 'd1;//2
    			else if(cnt>='d10416&&cnt<='d15623)
    				rx_pin_in <= 'd0;3
    			else if(cnt>='d15624&&cnt<='d20831)
    				rx_pin_in <= 'd1;///4
    			else if(cnt>='d20832&&cnt<='d26039)
    				rx_pin_in <= 'd0;5
    			else if(cnt>='d26040&&cnt<='d31247)
    				rx_pin_in <= 'd1;///6
    			else if(cnt>='d31248&&cnt<='d36455)
    				rx_pin_in <= 'd0;///7
    			else if(cnt>='d36456&&cnt<='d41663)
    				rx_pin_in <= 'd1;///8
    			else if(cnt>='d41664&&cnt<='d46871)
    				rx_pin_in <= 'd1;///9
    			else if(cnt>='d46872&&cnt<='d52079)
    				rx_pin_in <= 'd1;///10
    			else if(cnt>='d52080&&cnt<='d57287)
    				rx_pin_in <= 'd1;///11
    endmodule
    
    

    Isim行为仿真结果:

    图7 仿真结果

    从仿真波形中可以看出,当串行发送信号 01010101111时,在done信号拉高时接收数据完毕,显示接收的数据是11010101。因此,从仿真上看串口的接收可以正常工作。

     

    展开全文
  • 单片机(AT89C51)的串行接口及串行通信是非常重要的一项技术,我们需要有深度的解刨才可以理解透彻,既然进来了我肯定不会让你失望,点个小赞再走吧。 正式进入串口通信前我们需要了解什么是通信? 计算机与...
  • 一、 1、完整工程下载链接 ... 没积分的关注收藏私信要一下。感谢。 二、硬件 基于原子的精英板,单片机型号stm32f103zet6. ...3、将PD2 PA11 短接,主函数串口打印 pwm脉冲个数。 4、控制TIM1 pwm 输出 4个周期后
  • 串口显示脉冲数 LCD显示转速 基于stm32f103ze 正交编码器读取
  • 图1所示为脉冲宽度调制系统的原理框图波形图。该系统有一个比较器一个周期为Ts的锯齿波发生器组成。语音信号如果大于锯齿波信号,比较器输出正常数A,否则输出0。因此,从图1中可以看出,比较器输出一列下降沿...
  • 串行接口(UART)------verilog实现串口发送模块

    万次阅读 多人点赞 2018-11-19 12:08:06
    前面一篇博客实现已经分析并实现串行接口的接收模块。其中,串口的波特率对串口来说是一个比较重要的概念,因为其决定了接收或者发送一位数据所用的时间。由于FPGA所用的时钟通常远比串口的波特率快,所以在使用FPGA...
  • RS-485总线具有结构简单、通信距离远、通信速度快、...脉冲群干扰是一种常见的干扰。通常采用电快速脉冲群(EFT)免疫试验来模拟干扰,验证系统的可靠性。  1、脉冲群骚扰的来源  在工业控制环境中经常会出现雷...
  • STM32控制步进电机脉冲定位

    千次阅读 2021-03-22 22:56:10
    在成功启动步进电机之后,可通过运行数个脉冲后停止定时器做到控制步进电机转动特定角度,实现脉冲定位。 前言 STM32控制启动步进电机 原理 步进电机是将电脉冲转化为角位移的执行机构,也就是当步进驱动器接收到一...
  • SSI208P模块将同步串行接口数据转换成并行接口数据,内部集成了SSI同步时钟发生器、脉冲计数器、数据串并转换、接口控制逻辑、输出控制以及收发驱动器(TTL-RS422电平转换)等功能单元,用户无须了解SSI数据格式,该...
  • 定时器和串口

    2020-05-17 14:41:47
    )定时器可以被用来测量输出信号的脉冲长度,或者产生输出波形(输出比较PWM(脉冲宽度调制,通过改变脉冲宽度改变输出电压,本质上就是调节占空比,能输出PWM的IO口是固定的,可以通过重映射改变引脚)),每个...
  • 超宽带无线通信技术是目前无线通信领域先进的通信技术之一,它利用极宽频带的超窄脉冲进行无线通信,在无载波脉冲体制雷达中被广泛应用,多年来一直被限定为军用技术。近年来,随着电子技术的飞速发展,在无线通信...
  • 随着数模转换器的转换速率越来越高,JESD204B 串行接口已经越来越多地广泛用在数模转换器上,其对器件时钟同步时钟之间的时序关系有着严格需求。本文就重点讲解了JESD204B 数模转换器的时钟规范,以及利用TI 公司...
  • /**在串口助手,以十六进制向实验板发送01命令,表示 ...***023s 22296us“并返回两次负跳变之间的脉冲周期。 ***”Result is:002s 37560us“,当以十六进制向实验板 ***发送02命令时,表示停止定.
  • ESP32 单片机学习笔记 - 03 - MCPWM脉冲输出/PCNT脉冲计数 前言,继续上一篇的内容。因为上一篇刚好实验了iicspi,形成一对。接下来讲pwm另起一篇。 一、电机PWM输出 - MCPWM 官方例程: esp-idf/examples/...
  • 为了产生不同频率, 不同脉宽的刺激信号, 利用 RS232 串行通信接口将计算机与单片机相连, 计算机通过 LabVIEW 软件平台, 对单片机发送指令参数, 单片机利用接收到的指令参数产生计算机所指定的脉冲。 介绍了该...
  • 原标题:网络型脉冲电子围栏系统介绍在传统周界防范的应用中,脉冲电子围栏系统主要以485总线的方式进行信号传输,采取这种方式需要布线,安装较为繁琐。为了满足越来越多的客户的需求,艾礼安自主研发设计出了一套...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,456
精华内容 7,382
关键字:

串口和脉冲