一、说明书摘要



驱动时序说明:

串口模式的时序很简单,向US100发送一帧0x55的数据即为测距,发送0x50即为测温,测距US100会返回2帧8位数据,分两次发送回来,第一帧为距离高8位,第二帧是距离低8位。测温US100只返回一帧数据。

Verilog代码

串口发送模块

//作者:杨成煜
//日期:2020/4/7
//`define SIM
module  uart_tx(//system signalsinput           sclk,input          s_rst_n,//Uart_Interfaceoutput  reg     rs232_tx,//othersinput          tx_trig,input   [7:0]   tx_data,output          tx_byte_done
);
//=================================================
//**********define parameters and internal signals*
//=================================================
`ifndef SIM
localparam  BAUD_END=5207;
`else
localparam  BAUD_END=56;
`endif
localparam  BAUD_M=BAUD_END/2-1;
localparam  BIT_END=8;reg  [7:0]   tx_data_r;
reg         tx_flag;
reg [12:0]  baud_cnt;
reg         bit_flag;
reg [3:0]   bit_cnt;
//=================================================
//**********main code*******************
//=================================================
//tx_byte_done
assign tx_byte_done = (bit_cnt==BIT_END&&bit_flag==1'b1)?1'b1:1'b0;
//tx_data_r
always  @(posedge sclk or negedge s_rst_n)beginif(s_rst_n==1'b0)tx_data_r <= 'd0;else if(tx_trig==1'b1 && tx_flag==1'b0)tx_data_r <= tx_data;
end
//tx_flag
always  @(posedge sclk or negedge s_rst_n)beginif(s_rst_n==1'b0)tx_flag <= 1'b0;else if(tx_trig==1'b1)tx_flag <= 1'b1;else if(bit_cnt==BIT_END && bit_flag==1'b1)tx_flag <= 1'b0;
end//baud_cnt
always  @(posedge sclk or negedge s_rst_n)beginif(s_rst_n==1'b0)baud_cnt <= 'd0;else if(baud_cnt==BAUD_END)baud_cnt <= 'd0;else if(tx_flag==1'b1)baud_cnt <= baud_cnt + 1'b1;elsebaud_cnt <= 'd0;
end//bit_flag
always  @(posedge sclk or negedge s_rst_n)beginif(s_rst_n==1'b0)bit_flag <= 1'b0;else if(baud_cnt==BAUD_END)bit_flag <= 1'b1;elsebit_flag <= 1'b0;
end//bit_cnt
always  @(posedge sclk or negedge s_rst_n)beginif(s_rst_n==1'b0)bit_cnt <= 'd0;else if(bit_flag==1'b1 && bit_cnt==BIT_END)bit_cnt <= 'd0;else if(bit_flag==1'b1)bit_cnt <= bit_cnt + 1'b1;
end//rs232_tx
always  @(posedge sclk or negedge s_rst_n)beginif(s_rst_n==1'b0)rs232_tx <= 1'b1;else if(tx_flag==1'b1)case(bit_cnt)0:rs232_tx <= 1'b0;//start_bit1:rs232_tx <= tx_data_r[0];2:rs232_tx <= tx_data_r[1];3:rs232_tx <= tx_data_r[2];4:rs232_tx <= tx_data_r[3];5:rs232_tx <= tx_data_r[4];6:rs232_tx <= tx_data_r[5];7:rs232_tx <= tx_data_r[6];8:rs232_tx <= tx_data_r[7];default:rs232_tx <= 1'b1;endcaseelsers232_tx <= 1'b1;
end
endmodule

串口接收模块

//作者:杨成煜
//日期:2020/4/7
//`define SIM
module uart_rx(//system signalsinput                sclk,input              s_rst_n,//uart interfaceinput               rs232_rx,//othersoutput reg [7:0]   rx_data,output  reg         po_flag
);//=================================================
//**********define parameters and internal signals*
//=================================================
`ifndef SIM
localparam  BAUD_END=5207;
`else
localparam  BAUD_END=56;
`endif
localparam  BAUD_M=BAUD_END/2-1;
localparam  BIT_END=8;reg          rx_r1;
reg         rx_r2;
reg         rx_r3;
reg         rx_flag;
reg[12:0]   baud_cnt;
reg         bit_flag;
reg[3:0]    bit_cnt;wire        rx_neg;
//=================================================
//**********main code*******************
//=================================================
assign      rx_neg = (rx_r3)&(~rx_r2);always   @(posedge sclk or negedge s_rst_n)beginif(s_rst_n == 1'b0)baud_cnt <= 'd0;else if(baud_cnt == BAUD_END)baud_cnt <= 'd0;else if(rx_flag == 1'b1)baud_cnt <= baud_cnt + 1'b1;elsebaud_cnt <= 'd0;
endalways   @(posedge sclk)beginrx_r1 <= rs232_rx;rx_r2 <= rx_r1;rx_r3 <= rx_r2;
endalways   @(posedge sclk or negedge s_rst_n)beginif(s_rst_n==1'b0)rx_flag <= 1'b0;else if(rx_neg==1'b1)rx_flag <= 1'b1;else if(bit_cnt=='d0 && baud_cnt==BAUD_END)rx_flag <= 1'b0;
endalways   @(posedge sclk or negedge s_rst_n)beginif(s_rst_n==1'b0)bit_flag <= 1'b0;else if(baud_cnt==BAUD_M)bit_flag <= 1'b1;elsebit_flag <= 1'b0;
endalways   @(posedge sclk or negedge s_rst_n)beginif(s_rst_n==1'b0)bit_cnt <= 'd0;else if(bit_cnt == BIT_END && bit_flag == 1'b1)bit_cnt <= 'd0;else if(bit_flag == 1'b1)bit_cnt <= bit_cnt + 1'b1;
endalways   @(posedge sclk or negedge s_rst_n)beginif(s_rst_n==1'b0)rx_data <= 'd0;else if(bit_flag==1'b1 && bit_cnt>='d1)rx_data <= {rx_r2,rx_data[7:1]};
endalways   @(posedge sclk or negedge s_rst_n)beginif(s_rst_n==1'b0)po_flag <= 1'b0;else if(bit_cnt == BIT_END && bit_flag == 1'b1)po_flag <= 1'b1;elsepo_flag <= 1'b0;
end
endmodule

命令裁决模块

//作者:杨成煜
//日期:2020/4/7
//==================defines=====================
`define SIM
module  arbit(//================System Signal================input  clk,input   rst_n,//================Interface====================input  get_dis_req,input   get_temp_req,output reg[7:0]    cmd,output  trig_get_dis_req,output trig_get_temp_req
);//================parameters===================`ifndef SIM`else`endif//================System regs==================reg get_dis_req_t0;reg get_dis_req_t1;reg get_temp_req_t0;reg get_temp_req_t1;//================Main Codes===================always    @(posedge clk)beginget_dis_req_t0 <= get_dis_req;get_dis_req_t1 <= get_dis_req_t0;get_temp_req_t0 <= get_temp_req;get_temp_req_t1 <= get_dis_req_t0;endassign trig_get_dis_req = get_dis_req_t0&(~get_dis_req_t1);assign trig_get_temp_req = get_temp_req_t0&(~get_dis_req_t1);always    @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)cmd <= 'd0;else if(trig_get_dis_req==1'b1)cmd <= 8'h55;else if(trig_get_temp_req==1'b1)cmd <= 8'h50;end
endmodule

顶层模块

//作者:杨成煜
//日期:2020/4/7
//==================defines=====================
`define SIM
`define UART_MOD
module  US100(//================System Signal================input              clk,input               rst_n,//================Interface====================input              rx,//link to us100 txoutput             tx,//link to us100 rxinput              get_dis_req,input               get_temp_req,output reg[15:0]   distance,output reg[7:0]        temprature
);//================parameters===================`ifndef SIM`else`endiflocalparam         S_IDLE          =5'b00001;localparam          S_GET_DIS       =5'b00010;localparam          S_GET_TEMP      =5'b00100;//================System reg===================reg[4:0]          state;wire[7:0]         cmd;wire                trig_get_dis_req;wire               trig_get_temp_req;wire[7:0]         rx_data;wire                flag_data_get;reg                   cnt_dis_byte;wire               tx_req;//================Main code====================//cnt_dis_bytealways  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)cnt_dis_byte <= 1'b0;else if(state==S_GET_DIS&&cnt_dis_byte==1'b1&&flag_data_get==1'b1)cnt_dis_byte <= 1'b0;else if(state==S_GET_DIS&&flag_data_get==1'b1)cnt_dis_byte <= 1'b1;elsecnt_dis_byte <= 1'b0;endassign       tx_req = trig_get_dis_req|trig_get_temp_req;always @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)state <= S_IDLE;else case(state)S_IDLE:beginif(trig_get_dis_req==1'b1)state <= S_GET_DIS;else if(trig_get_temp_req==1'b1)state <= S_GET_TEMP;elsestate <= S_IDLE;endS_GET_DIS:beginif(flag_data_get==1'b1&&cnt_dis_byte==1'b1)state <= S_IDLE;elsestate <= S_GET_DIS;endS_GET_TEMP:beginif(flag_data_get==1'b1)state <= S_IDLE;elsestate <= S_GET_TEMP;enddefault:state <= S_IDLE;endcaseend//distancealways  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)distance <= 'd0;else if(state==S_GET_DIS&&flag_data_get==1'b1)distance <= {distance[7:0],rx_data};end//tempraturealways    @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)temprature <= 'd0;else if(state==S_GET_TEMP&&flag_data_get==1'b1)temprature <= rx_data;endarbit arbit_inst(//================System Signal================.clk             (clk),.rst_n                (rst_n),//================Interface====================.get_dis_req     (get_dis_req),.get_temp_req     (get_temp_req),.cmd             (cmd),.trig_get_dis_req (trig_get_dis_req),.trig_get_temp_req   (trig_get_temp_req)
);uart_rx us100_uart_rx_inst(//system signals.sclk          (clk),.s_rst_n      (rst_n),//uart interface.rs232_rx       (rx),//others.rx_data       (rx_data),.po_flag      (flag_data_get)
);uart_tx us100_uart_tx_inst(//system signals.sclk          (clk),.s_rst_n      (rst_n),//Uart_Interface.rs232_tx       (tx),//others.tx_trig       (tx_req),.tx_data       (cmd),.tx_byte_done ()
);
endmodule

US100超声波测距模块的FPGA驱动相关推荐

  1. 输出高电平程序c语言,51用c语言怎么编程检测US-100超声波测距模块echo/rx引脚输出高电平时间长度,,谁能给我个模板...

    满意答案 lixsh518 2016.07.24 采纳率:46%    等级:9 已帮助:768人 #include #define uchar unsigned char #define uint ...

  2. US-100超声波测距

    最近在做物联网实训,智能停车场项目用到了US-100超声波传感器,这里给大家介绍一下US-100传感器的使用. 1.介绍 US-100超声波测距模块可实现2cm ~ 4.5m的非接触测距功能,拥有2. ...

  3. US100超声波测距传感器linux,US100超声波传感器手册

    US100超声波传感器手册 (2011-08-13 17:42:47) 标签: 杂谈 US-100 超声波测距模块 1. 概述 US-100 超声波测距模块可实现2cm~4.5m 的非接触测距功 能, ...

  4. 基于DE2 115开发板驱动HC_SR04超声波测距模块【附源码】

    目录 1. 实验平台与目的 2. 实验要求 3. 实验原理 3.1. 理论原理 3.2. 硬件模块时序图 4. 系统架构设计 5. 模块说明 5.1. hc_sr_driver端口信号列表 5.2. ...

  5. STM32—驱动HC-SR04超声波测距模块

    文章目录 超声波测距原理 HC-SR04工作原理 STM32实现驱动 1.引脚的配置 2.时序控制 3.时间差测量 4.如何将距离测出来 超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精 ...

  6. ROS 之 arduino 驱动 超声波测距模块

    US-015是目前市场上分辨率最高,重复测量一致性最好的超声波测距模块:US-015的分辨率高于1mm,可达0.5mm,测距精度高:重复测量一致性好,测距稳定可靠.US-015超声波测距模块可实现2c ...

  7. 超声波测距模块HC-SR04详解(基于51单片机)

    本篇文章是个人整理的包含超声波测距模块HC-SR04的基本介绍与基本工作原理以及分别通过LCD1602.数码管和串口显示距离的实例讲解与代码的笔记,部分内容来自<HC-SR04超声波测距模块说明 ...

  8. HC-SR04超声波测距模块功能简述

    HC-SR04是一款升级的超声波测距模块.新增加UART,IIC 及 1-WIRE(单总线)功能,模式可以通过外围电阻设置. 2CM 超小盲区,4M 典型最远测距,2mA 超低工作电流.采用自研超声波 ...

  9. HC-SR04超声波测距模块学习记录

    文章目录 一.关于HC-SR04超声波测距模块 1.硬件介绍 2.工作原理 二.基于STM32的驱动代码 一.关于HC-SR04超声波测距模块 1.硬件介绍 HC-SR04 超声波测距模块可提供 2c ...

最新文章

  1. 读写配置文件(.ini)
  2. ServiceManager 进程启动源码分析
  3. 使用计算机 发展了人的运算能力,人们对计算的需求有多大?
  4. Ubuntu14 Could not open file /var/lib/dpkg/status - open
  5. 苹果“大力鼠”不敌微软“鲨”
  6. 多维度积分管理系统java_Java毕业设计——超市积分管理系统项目设计
  7. 2019年5月的Flag!
  8. 教你联想一体机win7系统安装教程
  9. Cobaltstrike Socks 代理隧道
  10. easyui-filebox清空方法扩展自TextBox
  11. ASP.NET Web API项目自动生成接口文档和测试页面
  12. 微信支付宝刷脸支付竞争已经枕戈待旦
  13. UE4-(雾效)大气雾
  14. CSS如何清除默认样式,背景属性
  15. 专业软件测试工程师必备之软件测试要学什么技能?
  16. 中文加解密异常的问题
  17. centos配置启动项_查看centos开机启动项命令 - 老牛博客
  18. MySQL数据库设计规范
  19. 【elasticsearch】问题解决:Remote responded with a chunk that was too large. Use a smaller batch size
  20. Abstract(抽象) implement和extend

热门文章

  1. WebAssembly在白鹭引擎5.0中的实践
  2. 如何一键关闭所有视窗?
  3. 伦敦大学学院计算机科学世界排名,伦敦大学学院世界排名及专业排名汇总(QS世界大学排名版)...
  4. 【ES实战】在Linux下 CentOS 7离线安装Rally2.7.0
  5. 获取Excel单元格存储日期格式数据
  6. 用Excel理解神经网络
  7. 关于高数中导数极限与函数可导性的关系
  8. MATLAB怎么计算曲面面积,Matlab曲面面积估计.doc
  9. 出书挂名流程 出书挂名步骤
  10. authorize(权限验证)