FPGA入门实验-基于状态机实现4位共阴极数码管显示超声波模块读数
任务目标
基于状态机实现4位共阴极数码管显示超声波模块读数。最近生产实习的FPGA培训课程内容,还是挺简单的。具体原理其他文章应该都烂大街了,重点是状态机的写法,还是很少博主写,没怎么看到,基本上都是时序机写的模块功能。
实现代码
4位共阴极数码模块代码seg.v:
`timescale 1ns/1ps
module seg
#(parameter SYSCLK = 125_000_000,parameter TIME = 1000,parameter MODE = 0 // 0 gong yin ji; 1 gong yang ji
)(input sysclk,input rst_n,input [4:0] set,//xian shi jin zhi:8/10/16input [15:0] number,output [3:0] DIG,output [7:0] SEG);
reg [3:0] DIG_t;
reg[7:0] SEG_t;
reg[31:0] cnt;
//-------------译码-----------//
function [7:0] seg_out;input [3:0] number_in;case(number_in)4'd0: seg_out = 8'hc0; 4'd1: seg_out = 8'hf9; 4'd2: seg_out = 8'ha4; 4'd3: seg_out = 8'hb0; 4'd4: seg_out = 8'h99; 4'd5: seg_out = 8'h92; 4'd6: seg_out = 8'h82; 4'd7: seg_out = 8'hf8; 4'd8: seg_out = 8'h80; 4'd9: seg_out = 8'h90; 4'd10: seg_out = 8'h88; 4'd11: seg_out = 8'h83; 4'd12: seg_out = 8'hc6; 4'd13: seg_out = 8'ha1; 4'd14: seg_out = 8'h86; 4'd15: seg_out = 8'h8e; default:seg_out = 8'hff;endcase
endfunction /* wei xuan qie huan */
always@(posedge sysclk)if(!rst_n) beginDIG_t <= 4'b0001;cnt <= 32'd0;endelse if(cnt>=TIME-1) beginDIG_t <= {DIG_t[2:0],DIG_t[3]};cnt <= 32'd0;endelse beginDIG_t <= DIG_t;cnt <= cnt + 32'd1;end/*shu jv ti qv*/
reg[3:0] num1,num2,num3,num4;
always@(*)beginnum1 <= number%set; // ge weinum2 <= (number/set)%set; //shi weinum3 <= (number/(set*set))%set; //bai weinum4 <= (number/(set*set*set))%set; // qian wei
end/*duan xuan shu chu*/
always@(posedge sysclk)if(!rst_n)SEG_t <= 8'hff;elsecase(DIG_t)4'b0001:SEG_t <= seg_out(num1);4'b0010:SEG_t <= seg_out(num2);4'b0100:SEG_t <= seg_out(num3);4'b1000:SEG_t <= seg_out(num4);default:SEG_t <= 8'hff;endcase
assign SEG = (MODE)?SEG_t:~SEG_t;
assign DIG = (MODE)?DIG_t:~DIG_t;
endmodule
超声波模块代码trasonic.v:
`timescale 1ns / 1ps
module trasonic
#(parameter SYSCLK = 125_000_000,parameter TIME1 = 5000,//激励时间(大于等于10us)parameter TIME2 = 200_000_00 //总周期 (大于等于80ms)
)
(input sysclk ,input rst_n ,input Echo ,output reg Trig ,output reg [15:0] distence);
localparam IDLE = 2'd0;
localparam TRIG = 2'd1;
localparam RECE = 2'd2;
reg [31:0] cnt;
reg [63:0] number;//距离寄存器
reg [1:0] cur_state,next_state;
reg [63:0]h_cnt;//记录高电平所在的次数
//____________________state1______________________//
always@(posedge sysclk)if(!rst_n)cur_state <= IDLE;elsecur_state <= next_state;
//______________________state2_____________________//
always@(*)beginnext_state = IDLE;case(cur_state)IDLE:beginnext_state = TRIG;endTRIG:beginif(cnt >= TIME1 - 1)next_state = RECE;elsenext_state = cur_state;endRECE:beginif(cnt >= TIME2 - 1)next_state = IDLE;elsenext_state = cur_state;enddefault:next_state = IDLE;endcase
end
//________________________state3______________________//
always@(posedge sysclk)if(!rst_n)begincnt <= 32'd0;Trig <= 0;h_cnt <= 64'd0;endelsecase(cur_state)IDLE:begincnt <= 32'd0;Trig <= 0;h_cnt <= 64'd0; endTRIG:beginTrig <= 1;cnt <= cnt + 32'd1;h_cnt <= 64'd0; endRECE:beginTrig <= 0;cnt <= cnt + 32'd1;if(Echo)h_cnt <= h_cnt + 64'd1;elseh_cnt <= h_cnt;enddefault:begincnt <= 32'd0;Trig <= 0;h_cnt <= 64'd0; endendcase
//_____________________数据处理_____________________//
localparam t = 1000_000_000;
localparam T = t/SYSCLK;//(8ns)
always@(*)number = (cnt == (TIME2 - 1)) ? ((h_cnt*T)/58/1000):number;//保证数据稳定传输
always@(*)distence = number;
endmodule
顶层文件top.v:
module top(input sysclk ,input rst_n ,input Echo ,output Trig ,output [7:0] SEG ,output [3:0] DIG);wire [15:0] num;seg
#(.SYSCLK (125_000_000) ,.TIME (1000) ,.MODE (0)
)a(.sysclk (sysclk) ,.rst_n (rst_n) ,.set (10) ,.number (num) ,.DIG (DIG) ,.SEG (SEG));trasonic
#(.SYSCLK (125_000_000) ,.TIME1 (5000 ) ,.TIME2 (20_000_000 )
)b(.sysclk (sysclk) ,.rst_n (rst_n) ,.Echo (Echo) ,.Trig (Trig) ,.distence(num));endmodule
结语
这个需要的引脚挺多的——14个pin,在引脚配置的时候别重复了哦。不然生成二进制文件流的时候会报错。
FPGA入门实验-基于状态机实现4位共阴极数码管显示超声波模块读数相关推荐
- FPGA入门实验-基于状态机实现串口回环收发
任务目标 基于状态机实现串口回环收发.最近生产实习的FPGA培训课程内容,还是挺简单的.具体原理其他文章应该都烂大街了,重点是状态机的写法,还是很少博主写,没怎么看到,基本上都是时序机写的模块功能. ...
- [STM32F1]基于STM32F103实现TM1640点亮16位共阴极数码管,显示“0~F”数字
本节我们目标是实现TM1640点亮16位共阴极数码管,显示"0~F"数字: 1. 硬件设计 GPIO初始化配置 SCL(PB6) SDA(PB7):开漏输出,通过IO模拟驱动TM ...
- 入门必做的51单片机实验2----》利用外部中断的方法来控制发光二极管和共阴极数码管显示十六进制的0到F
嘿!各位中午好! 我是肖肖的猪会飞 欢迎收看肖小猪频道 刚刚做了个单片机实验->ヽ( ̄ω ̄( ̄ω ̄")ゝ 分享一下 文章目录 前言 一,实验题目 二,程序 三,仿真效果 前言 此实验为 ...
- FPGA课程设计——数字电子时钟VERILOG(基于正点原子新起点开发板,支持8位或6位共阳极数码管显示时分秒毫秒,可校时,可设闹钟,闹钟开关,led指示)
2019级电子科学与技术专业FPGA课程设计 报 告 2022 年 5 月 20 日 多功能数字电子钟的设计 摘要 电子设计自动化(EDA)是一种实现电子系统或电子产品自动化设计的技术,使用ED ...
- 四位数码管秒表 c语言编程,4位共阴极数码管秒表设计仿真与程序
#include "reg51.h" #include "intrins.h" #define GPIO_DIG P2 ...
- c语言六个数码管显示123456,用51单片机C语言编写程序实现6位共阴极数码管循环显示0123456789ABCDEF,六个数码管是连续不同的六个数?...
# include # define uint unsigned int # define uchar unsigned char code uchar shu[] = {0x3f,0x06,0x5b ...
- 4位共阴极数码管驱动
这个是考核时候做的,期间做了消隐,感受良多,现在分享给大家看看. #include <STC15F2K60S2.H> #include <Digital595.h> #incl ...
- STM32F103C8T6 I/O口驱动4位共阳数码管
STM32F103C8T6 I/O口驱动4位共阳数码管 看了网上很多的资料.很少有单独讲解STM32 I/O口直接驱动数码管的资料,有的网上还禁用了JTAG和SWD口,对很多刚入门的学者会造成不必要的 ...
- Arduino 用4位共阴数码管造一个计数器
之前已经学习过单位的数码管,现在来看看4位的数码管是如何工作的. 相对于单位的数码管, 可以看到针脚多了com1,com2,com3,com4, 但控制字符的abcdefgh针脚,仍然是只有8个, 那 ...
- 三位共阴数码管动态显示按键控制加减
用这个软件也有一两个月了,学习了很多大神的教程代码,让我飞速的进步学习了解电子科技的知识,现在我也想回报大家,慢慢写文章发布我所了解的项目的教程,尽可能写简单通俗,让大部分初学者都能看懂. 买这东东将 ...
最新文章
- Docker官方文档翻译2
- poj1386(判断一个有向图是否存在欧拉回路)
- 【云栖说第三期】发现大家对能模仿马云声音的ET有兴趣,我们找了阿里四位专家来聊聊ET背后的人工智能...
- 【struts2+hibernate+spring项目实战】分页功能的完整的实现(通用分页、基类实现)
- 移动端触屏网页的触摸事件
- Java技术分享:void的用法和意义
- NHibernate错误集锦及配置技巧
- 手机outlook刷新不出邮件_网页端Outlook推Spaces功能:轻松整合邮件、会议和文档...
- 云和物联网(IoT)是不可分割的,因为物联网需要云来运行和执行
- Android开发入门的正确姿势,你get到了吗?
- 【软考】专栏导读(软考全面介绍、资格报考建议)
- 升降压电路的设计和分析
- java时间日期相减得到天数_java日期相减得到天数
- 数字化时代,如何提高企业的交易管理效率?
- python拦截广告弹窗_电脑总是有弹窗广告,真的烦人,一招教你解决!
- 【大数据安全分析】图计算在安全方面的应用思考
- C/C++外卖点餐管理程序
- [艾兰岛]制作传送门之传送技能——kura酱长期更新
- UI优化策略-Shader篇
- 使用python发送邮件(新浪)
热门文章
- 使用TTP223触摸传感器和Arduino UNO开发板实现触摸控制灯泡
- 实验吧 天网管理系统writeup
- 解决 kindle 书籍字体颜色偏淡问题的方法
- 阿里巴巴集团2015年秋季校招在线笔试附加题分析
- CI/CD---使用新版云效流水线自动部署前端Vue项目
- 图像处理之相似图片识别(直方图应用篇)
- 小知识:btn.addEventListener is not a function报错处理
- cheng@ARM结构与编程之day3-MOV LSL
- Java实现 kiosk模式,適用於Linux Java Swing應用程序的Kiosk模式
- bucket name does not follow Amazon S3 standards