US100超声波测距模块的FPGA驱动
一、说明书摘要
驱动时序说明:
串口模式的时序很简单,向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驱动相关推荐
- 输出高电平程序c语言,51用c语言怎么编程检测US-100超声波测距模块echo/rx引脚输出高电平时间长度,,谁能给我个模板...
满意答案 lixsh518 2016.07.24 采纳率:46% 等级:9 已帮助:768人 #include #define uchar unsigned char #define uint ...
- US-100超声波测距
最近在做物联网实训,智能停车场项目用到了US-100超声波传感器,这里给大家介绍一下US-100传感器的使用. 1.介绍 US-100超声波测距模块可实现2cm ~ 4.5m的非接触测距功能,拥有2. ...
- US100超声波测距传感器linux,US100超声波传感器手册
US100超声波传感器手册 (2011-08-13 17:42:47) 标签: 杂谈 US-100 超声波测距模块 1. 概述 US-100 超声波测距模块可实现2cm~4.5m 的非接触测距功 能, ...
- 基于DE2 115开发板驱动HC_SR04超声波测距模块【附源码】
目录 1. 实验平台与目的 2. 实验要求 3. 实验原理 3.1. 理论原理 3.2. 硬件模块时序图 4. 系统架构设计 5. 模块说明 5.1. hc_sr_driver端口信号列表 5.2. ...
- STM32—驱动HC-SR04超声波测距模块
文章目录 超声波测距原理 HC-SR04工作原理 STM32实现驱动 1.引脚的配置 2.时序控制 3.时间差测量 4.如何将距离测出来 超声波测距原理 利用HC-SR04超声波测距模块可以实现比较精 ...
- ROS 之 arduino 驱动 超声波测距模块
US-015是目前市场上分辨率最高,重复测量一致性最好的超声波测距模块:US-015的分辨率高于1mm,可达0.5mm,测距精度高:重复测量一致性好,测距稳定可靠.US-015超声波测距模块可实现2c ...
- 超声波测距模块HC-SR04详解(基于51单片机)
本篇文章是个人整理的包含超声波测距模块HC-SR04的基本介绍与基本工作原理以及分别通过LCD1602.数码管和串口显示距离的实例讲解与代码的笔记,部分内容来自<HC-SR04超声波测距模块说明 ...
- HC-SR04超声波测距模块功能简述
HC-SR04是一款升级的超声波测距模块.新增加UART,IIC 及 1-WIRE(单总线)功能,模式可以通过外围电阻设置. 2CM 超小盲区,4M 典型最远测距,2mA 超低工作电流.采用自研超声波 ...
- HC-SR04超声波测距模块学习记录
文章目录 一.关于HC-SR04超声波测距模块 1.硬件介绍 2.工作原理 二.基于STM32的驱动代码 一.关于HC-SR04超声波测距模块 1.硬件介绍 HC-SR04 超声波测距模块可提供 2c ...
最新文章
- 读写配置文件(.ini)
- ServiceManager 进程启动源码分析
- 使用计算机 发展了人的运算能力,人们对计算的需求有多大?
- Ubuntu14 Could not open file /var/lib/dpkg/status - open
- 苹果“大力鼠”不敌微软“鲨”
- 多维度积分管理系统java_Java毕业设计——超市积分管理系统项目设计
- 2019年5月的Flag!
- 教你联想一体机win7系统安装教程
- Cobaltstrike Socks 代理隧道
- easyui-filebox清空方法扩展自TextBox
- ASP.NET Web API项目自动生成接口文档和测试页面
- 微信支付宝刷脸支付竞争已经枕戈待旦
- UE4-(雾效)大气雾
- CSS如何清除默认样式,背景属性
- 专业软件测试工程师必备之软件测试要学什么技能?
- 中文加解密异常的问题
- centos配置启动项_查看centos开机启动项命令 - 老牛博客
- MySQL数据库设计规范
- 【elasticsearch】问题解决:Remote responded with a chunk that was too large. Use a smaller batch size
- Abstract(抽象) implement和extend
热门文章
- WebAssembly在白鹭引擎5.0中的实践
- 如何一键关闭所有视窗?
- 伦敦大学学院计算机科学世界排名,伦敦大学学院世界排名及专业排名汇总(QS世界大学排名版)...
- 【ES实战】在Linux下 CentOS 7离线安装Rally2.7.0
- 获取Excel单元格存储日期格式数据
- 用Excel理解神经网络
- 关于高数中导数极限与函数可导性的关系
- MATLAB怎么计算曲面面积,Matlab曲面面积估计.doc
- 出书挂名流程 出书挂名步骤
- authorize(权限验证)