串口发送端verilog代码分析

  1 `timescale 1ns / 1ps
  2 //////////////////////////////////////////////////////////////////////////////////
  3 // Company:
  4 // Engineer: chensimin
  5 //
  6 // Create Date: 2018/05/23 13:59:45
  7 // Design Name:
  8 // Module Name: uart_tx
  9 // Project Name:
 10 // Target Devices:
 11 // Tool Versions:
 12 // Description:
 13 //
 14 // Dependencies:
 15 //
 16 // Revision:
 17 // Revision 0.01 - File Created
 18 // Additional Comments:
 19 //
 20 //////////////////////////////////////////////////////////////////////////////////
 21
 22
 23 module uart_tx(
 24
 25     input  wire clk,
 26     input  wire receive_ack,
 27     input  wire [7:0]data_o,
 28     output reg  txd
 29
 30     );
 31
 32     localparam  IDLE = 0,
 33                 SEND_START = 1,
 34                 SEND_DATA = 2,
 35                 SEND_END = 3;
 36
 37     reg txd = 0;
 38
 39     reg [3:0]cur_st = 0;
 40     reg [3:0]nxt_st = 0;
 41     always @(posedge clk)
 42     begin
 43         cur_st <= nxt_st;
 44     end
 45
 46     always @(*)
 47     begin
 48         nxt_st = cur_st;
 49
 50         case(cur_st)
 51
 52             IDLE:
 53             begin
 54                 if(receive_ack)
 55                     nxt_st = SEND_START;
 56             end
 57
 58             SEND_START:
 59             begin
 60                 nxt_st = SEND_DATA;
 61             end
 62
 63             //每次发送是8bit
 64             SEND_DATA:
 65             begin
 66                 if(count == 7)
 67                     nxt_st = SEND_END;
 68             end
 69
 70             SEND_END:
 71             begin
 72                 if(receive_ack)
 73                     nxt_st = SEND_START;
 74             end
 75
 76             default:
 77             begin
 78                 nxt_st = IDLE;
 79             end
 80
 81         endcase
 82     end
 83
 84     reg [4:0]count = 0;
 85     always @(posedge clk)
 86     begin
 87         if(cur_st == SEND_DATA)
 88             count <= count + 1‘b1;
 89
 90         else if(cur_st == IDLE || cur_st == SEND_END)
 91             count <= 0;
 92     end
 93
 94     reg [7:0]data_o_tmp = 0;
 95     always @(posedge clk)
 96     begin
 97         if(cur_st == SEND_START)
 98             data_o_tmp <= data_o;  // 在开始状态,采集数据
 99
100         else if(cur_st == SEND_DATA) //在发送状态,对暂存数据进行右移操作
101             data_o_tmp[6:0] <= data_o_tmp[7:1];
102     end
103
104     always @(posedge clk)
105     begin
106         if(cur_st == SEND_START)
107             txd <= 0;
108
109         else if(cur_st == SEND_DATA)
110             txd <= data_o_tmp[0];   //在发送状态,发送最低位
111
112         else if(cur_st == SEND_END)
113             txd <= 1;
114     end
115
116 endmodule
117
118
119
120 /*
121
122 add_force {/uart_tx/clk} -radix hex {1 0ns} {0 50000ps} -repeat_every 100000ps
123 add_force {/uart_tx/data_o} -radix hex {ab 0ns}
124 add_force {/uart_tx/receive_ack} -radix hex {1 0ns}
125
126
127 */

仿真结果:

原文地址:https://www.cnblogs.com/chensimin1990/p/9077417.html

时间: 2024-10-20 23:44:30

串口发送端verilog代码分析的相关文章

【vivado】AXI4接口verilog代码分析

用vivado创建new AXI4 IP,配置:AXI4-Full,Master.分析内部关于AXI4接口自动产生的代码. 在 M_AXI_ACLK 同步时钟下,抓取 INIT_AXI_TXN 由低变高,让 init_txn_pulse 产生个pulse信号. 输入信号 INIT_AXI_TXN 是这个ip的一个输入信号,应该是由用户在PL或PS侧控制: 产生信号 init_txn_pulse 负责在运行中初始化接口的关键控制信号,如同 M_AXI_ARESETN 下的初始化: Write Ad

Bluez SPP实现代码分析(转)

源:http://blog.csdn.net/walkingman321/article/details/7218705 本文分析蓝牙协议栈中蓝牙转串口(SPP)部分的实现. 1.  基本概念 Bluez提供了蓝牙转串口的功能,应用程序可以通过dbus接口控制bluez的串口功能. 1.1 启动SPP服务等待远端设备连接的过程: org.bluez.SerialProxyManager->CreateProxy         // 得到一个serial proxy org.bluez.Seri

RX232串口发送

在进行工程调试的时候有时候需要对变量进行观察,SingnaTap II Logic Analyzer 只能对管脚进行观察,所以要观察内部的变量必须把内部的变量进行输出.一种方法是直接把变量定义成管脚通过signaltap II观察,一种是用显示器显示,另外一种是通过串口进行观察.本文主要写了串口发送的一些代码. 时序图: 起始位0 数据8bit 结束位1 一共10bit 输入50MHz通过megawizard 生成9600Hz比例系数为3/15625; 代码如下: module RX232_IN

「51单片机」RS232串口通信代码分析

想来想去不知道要怎么样把232串口通信说清楚,想想还是直接把代码分析一遍吧... 重点是“常用波特率与定时器1的参数关系”这张表格!波特率的设置很重要! 一.串口初始化 void usart_init() { SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1 TMOD = 0x20; //定时器工作方式2 PCON = 0x00; TH1 = 0xFD; //波特率9600.数据位8.停止位1.效验位无 (11.0592M) TL1 = 0xFD; ES = 1; //开

hadoop核心逻辑shuffle代码分析-map端

首先要推荐一下:http://www.alidata.org/archives/1470 阿里的大牛在上面的文章中比较详细的介绍了shuffle过程中mapper和reduce的每个过程,强烈推荐先读一下. 不过,上文没有写明一些实现的细节,比如:spill的过程,mapper生成文件的 partition是怎么做的等等,相信有很多人跟我一样在看了上面的文章后还是有很多疑问,我也是带着疑问花了很久的看了cdh4.1.0版本 shuffle的逻辑,整理成本文,为以后回顾所用. 首先用一张图展示下m

【第五篇】androidEventbus源代码阅读和分析之发送粘性事件和接收粘性事件代码分析

代码里面发送粘性事件代码如下: // 发送Sticky事件 EventBus.getDefault().postSticky(new User("soyoungboy", "西安财经学院"), "soyoungboy"); 然后我们进入postSticky方法里面去: EventType 是什么? 该类是描述一个函数唯一性的对象,参数类型.tag两个条件保证了对象的唯一性.通过该类的对象来查找注册了相应类型和tag的所有订阅者{@see* Sub

jrtplib中组播代码发送端和接收端的实现

</pre>文章里面主要是把发送端课接收端代码的实现提了出来,和重要函数里的源码贴出来辅助学习,看到网上有人说好久做不出来,建议看看对应加入组播的源码,注意细节,话不多说,代码直接贴出来,各位朋友有意见多多交流.<p></p><p>发送端:</p><pre code_snippet_id="1677192" snippet_file_name="blog_20160510_2_5720022" nam

完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)

构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化的方式进行配置,所以维护起来相当困难.Gradle:Gradle采用增量构建.Gradle通过Groovy编程而不是传统的XML声明进行配置.Gradle可以很好地配合Maven进行依赖管理,并且把Ant脚本当作头等公民.字节码操作 编程操作Java字节码的函数库. ASM:通用底层字节码操作及分析

用python做自动化测试--对服务器端的自动化测试(2)-发送端模拟器

python的http client库很多,有httplib, urllib 和urllib2,但这几个用起来还是比较麻烦,requests 是高富帅(http://docs.python-requests.org/en/latest/),接口更简洁,优雅. 支持Json, 很方便设置发送的header, session管理. #!/usr/bin/env python #coding=utf-8 import time,logging,sys,os import pickle import u