zoukankan      html  css  js  c++  java
  • 10通信入门之串口接收

    一设计功能

    实现FPGA开发板能够收到PC发送的一字节数据,共8比特。串口接收一个是波特率,还有就是接收引脚的下降沿检测,最后就是数据接收的时序逻辑。在开始时,接收引脚是空闲状态,当接收引脚下降沿到来时,先来一个起始位,然后是八位的数据位,每到一个波特率时钟传输一个数据位,接收完八位数据后,八位数据位后就是停止位。接收引脚进入空闲态即高电平。要想稳定得接收数据,得有控制信号,如开始信号,接收完成信号等,这是方便模块的调用。

    二设计输入

    下面是串口接收的时序图,我设计程序就是根据这个照图施工。

    module uart_rx(
    input wire sclk,
    input wire s_rst_n,
    input wire rx,
    output reg[7:0] po_data,
    output reg po_flag

    );

    reg bit_flag;
    //三个寄存器打三拍
    //negedge detech
    reg rx1;
    reg rx2;
    reg rx2_reg;
    //位拼接符实现打三拍好奇妙
    always@(posedge sclk or negedge s_rst_n)begin
    if(s_rst_n==0)begin
    rx1<=1;
    rx2<=1;
    rx2_reg <= 1;
    end
    else begin
    {rx2_reg,rx2,rx1}<={rx2,rx1,rx};
    end
    end

    //接收引脚的下降沿
    reg rx_flag;
    always @(posedge sclk or posedge s_rst_n) begin
    if (s_rst_n==0) begin
    rx_flag<=0;// reset

    end
    else if (!rx2 & rx2_reg) begin
    rx_flag<=1;
    end
    else if(bit_cnt==4'd8 & bit_flag)
    rx_flag<=0;
    end
    //波特率计数器
    //注意if语句的优先级即越特殊范围越小放最前面
    //如复位语句,最大值,条件的真子集
    parameter cnt_HALF = 12'd2604;
    parameter cnt_MAX = 13'd5207;
    reg [12:0]cnt_baud;
    always@(posedge sclk or negedge s_rst_n)
    if(s_rst_n==0)
    cnt_baud<='d0;
    else if(cnt_baud==cnt_MAX)
    cnt_baud<= 13'd0;
    else if(bit_cnt==4'd8 & bit_flag)
    cnt_baud<=13'd0;
    else if(rx_flag)
    cnt_baud<=cnt_baud+1'b1;


    always@(posedge sclk or negedge s_rst_n)
    if(s_rst_n==0)
    bit_flag<=0;
    else if(cnt_baud==cnt_HALF)
    bit_flag<=1;
    else
    bit_flag<=0;

    //if 语句的优先级
    //如(bit_cnt==4'd8 & bit_flag)比(bit_flag)
    //范围小,则小的放前面
    reg [3:0]bit_cnt;
    always @(posedge sclk or posedge s_rst_n) begin
    if (s_rst_n==0) begin
    bit_cnt<=0;// reset

    end
    else if(bit_cnt==4'd8 & bit_flag)
    bit_cnt<=4'd0;
    else if (bit_flag) begin
    bit_cnt<=bit_cnt+1'b1;
    end

    end
    //注意输出信号的同步赋值
    //如bit_cnt 和po_data,po_flag在最后赋值为零
    //都是在bit_flag拉高时
    //所以要想让这三个个信号同时为低,则条件相同即bit_flag拉高
    //如(bit_cnt>4'd1 & bit_cnt<=4'd8)这样会延迟一个时钟
    always@(posedge sclk or negedge s_rst_n)
    if(s_rst_n==0)
    po_data<=8'b0;
    else if(bit_cnt>4'd1 & bit_flag)
    po_data<={rx1,po_data[7:1]};

    //接收完成一个字节的标志信号
    //po_flag
    always@(posedge sclk or negedge s_rst_n)
    if(s_rst_n==0)
    po_flag <=0;
    else if(bit_cnt==4'd8 & bit_flag)
    po_flag<=1'b1;
    else begin
    po_flag<=0;
    end

    endmodule

    注意点:主要是分频器和输出信号的赋值,分频器主要分成勒分频计数值和分配标志信号。输出则是数据信号和接收完成标志信号。

  • 相关阅读:
    同事跳槽京东后,分享给我一份JAVA核心开发手册(架构筑基+开源框架+分布式架构+微服务架构+性能调优)
    只有2年经验的Java程序员,面试25K的阿里巴巴后端岗,已拿offer
    985硕士粉秋招拿下快手44万offer,面试资料学习经验分享
    年薪50万的程序员到底有多累、多辛苦?句句扎心。
    蚂蚁金服首发887页Java面试宝典!还原真实面试情景+面试题
    P8首谈做Java,在一线大厂做到金字塔顶端的人平时都如何学习?
    poj 2153 Rank List(查找,Map)
    算法导论 6-2 d叉堆
    算法导论 6.5.9 堆实现K路归并问题
    poj 2051 Argus(优先队列)
  • 原文地址:https://www.cnblogs.com/Xwangzi66/p/12906872.html
Copyright © 2011-2022 走看看