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

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

  • 相关阅读:
    MySQL 慢日志没有自动创建新的日志文件
    Springboot为什么加载不上application.yml的配置文件
    android studio set proxy
    c++ win32 遍历进程列表
    React Prompt组件 阻止用户离开页面
    JS 浏览器上生成 UUID API
    部署 Nestjs 最佳实践
    Nginx 部署 单页面应用 + nodejs api 应用 最佳实践
    React JS: 如何使用 RxService 管理状态
    umijs 开发优化和生产优化
  • 原文地址:https://www.cnblogs.com/Xwangzi66/p/12906872.html
Copyright © 2011-2022 走看看