至简设计系列_定时转换的LED交通灯1
–作者:肖肖肖
本文为明德扬原创及录用文章,转载请注明出处!
1.1 总体设计
1.1.1 概述
发光二极管简称为LED,是一种常用的发光器件,通过电子与空穴复合释放能量发光,它可以高效的将电能转化为光能,在现代社会具有广泛的用途,如照明、平板显示、医疗器件等。可通过高低电平的变化来控制LED灯的明灭状态,当输出信号为低电平时,LED灯亮,反之,当输出信号为高电平时,LED灯灭。
1.1.2 设计目标
实现开发板上东西南北 4 个方向,每个方向上的 3 个 LED 灯按照“绿灯–黄灯–红灯–绿灯–黄灯…”依次循环变化。变化的速度不同,东面的间隔时间为 1 秒;西面的间隔时间为 2 秒;南面的间隔时间为 3 秒;北面的间隔时间为 4 秒。
具体要求:
1、每个方向的灯分开独立设计。
2、首先设计东向的灯:设计一个计时 1 秒的计数器,用来计算灯的状态变化的时间间隔。
3、如果计时 1 秒到了,把黄灯点亮;再过 1 秒把红灯点亮;再过 1 秒,把绿灯点亮…
依次循环。
4、设计西方向的灯:设计一个计时 2 秒的计数器,其他的类似。
5、其它两个方向的设计类似。
1.1.3 信号列表
信号名 | I/O | 位宽 | 定义 |
---|---|---|---|
clk | I | 1 | 系统工作时钟 50M |
rst_n | I | 1 | 系统复位信号,低电平有效 |
led_east | O | 3 | 3 比特信号,表示东面三个 led 灯,最高位为红灯,最低位为绿灯,低电平时灯亮。 |
led_south | O | 3 | 3 比特信号,表示南面三个 led 灯,最高位为红灯,最低位为绿灯,低电平时灯亮。 |
led_west | O | 3 | 3 比特信号,表示西面三个 led 灯,最高位为红灯,最低位为绿灯,低电平时灯亮。 |
led_north | O | 3 | 3 比特信号,表示北面三个 led 灯,最高位为红灯,最低位为绿灯,低电平时灯亮。 |
1.1.4 设计思路
根据题目功能要求,东西南北四个方向LED灯颜色变换的速度都不同。因为在数字电路中的延时都是通过计数器实现的,计数器*时钟周期=延时时间。本模块中,由于输入时钟是50MHz,时钟周期为20ns,功能要求每1秒变化一次。我们通过counter来表示延时,当其值为1s/20ns=5000_0000时,表示1秒时间到。
本工程架构由四个计数器组成:
东方向计数器e_counter:该计数器用于计算东向1s的时钟个数,加一条件为1,表示一直计数;数到5000_0000下,则表示数到1秒了。
西方向计数器w_counter:该计数器用于计算西向2s的时钟个数,加一条件为1,表示一直计数;数到2*5000_0000下,则表示数到2秒了。
南方向计数器s_counter:该计数器用于计算南向3s的时钟个数,加一条件为1,表示一直计数;数到3*5000_0000下,则表示数到3秒了。
北方向计数器n_counter:该计数器用于计算北向4s的时钟个数,加一条件为1,表示一直计数;数到4*5000_0000下,则表示数到4秒了。
下面是东西南北四个方向的秒计数器的代码。
parameter COUNT_1S = 26'd5000_0000;
parameter COUNT_WID = 28;reg [COUNT_WID-1:0] e_counter;
reg [COUNT_WID-1:0] s_counter;
reg [COUNT_WID-1:0] w_counter;
reg [COUNT_WID-1:0] n_counter;wire add_e_counter;
wire end_e_counter;
wire add_w_counter;
wire end_w_counter;
wire add_s_counter;
wire end_s_counter;
wire add_n_counter;
wire end_n_counter;always @(posedge clk or negedge rst_n) begin if (rst_n==0) begine_counter <= 0; endelse if(add_e_counter) beginif(end_e_counter)e_counter <= 0; elsee_counter <= e_counter+1 ;end
end
assign add_e_counter = 1;
assign end_e_counter = add_e_counter && e_counter == COUNT_1S-1 ;always @(posedge clk or negedge rst_n) begin if (rst_n==0) beginw_counter <= 0; endelse if(add_w_counter) beginif(end_w_counter)w_counter <= 0; elsew_counter <= w_counter+1 ;end
end
assign add_w_counter = 1;
assign end_w_counter = add_w_counter && w_counter == 2*COUNT_1S-1 ;always @(posedge clk or negedge rst_n) begin if (rst_n==0) begins_counter <= 0; endelse if(add_s_counter) beginif(end_s_counter)s_counter <= 0; elses_counter <= s_counter+1 ;end
end
assign add_s_counter = 1;
assign end_s_counter = add_s_counter && s_counter == 3*COUNT_1S-1 ;always @(posedge clk or negedge rst_n) begin if (rst_n==0) beginn_counter <= 0; endelse if(add_n_counter) beginif(end_n_counter)n_counter <= 0; elsen_counter <= n_counter+1 ;end
end
assign add_n_counter = 1;
assign end_n_counter = add_n_counter && n_counter == 4*COUNT_1S-1 ;
LED灯信号的变化,根据功能要求,东面的间隔时间为 1 秒;西面的间隔时间为 2 秒;南面2的间隔时间为 3 秒;北面的间隔时间为 4 秒。计数时间到时变化;时间没到,则不变化。每一时刻每个方向只有一个灯亮,并且亮灯的颜色顺序按照“绿灯–黄灯–红灯–绿灯–黄灯…”依次循环变化。
东西南北四个方向的各有三盏不同颜色的LED灯,每个方向的三个LED灯都由3 比特信号控制,最高位为红灯,最低位为绿灯,并且低电平时LED灯亮。led_east表示东面三个LED灯,led_west表示西面三个LED灯,led_south表示南面三个LED灯,led_north表示北面三个LED灯。
三色LED灯的循环变换控制可以通过拼接的方法使数据循环左移来实现。
以led_east的变化为例,上电后,led_east[2:0]=3’b110;然后每隔1秒,依次循环变化:101,011,110。即end_e_counter(每隔1秒)时,led_east[2:0]数值循环左移,其他时候不变。
led_west、led_south、led_north也是同理,即:
上电后,led_west[2:0]=3’b110;然后每隔2秒,依次循环变化:101,011,110。即end_w_counter(每隔2秒)时,led_west[2:0]数值循环左移,其他时候不变。
上电后,led_south[2:0]=3’b110;然后每隔3秒,依次循环变化:101,011,110。即end_s_counter(每隔3秒)时,led_south[2:0]数值循环左移,其他时候不变。
上电后,led_north[2:0]=3’b110;然后每隔4秒,依次循环变化:101,011,110。即end_n_counter(每隔4秒)时,led_north[2:0]数值循环左移,其他时候不变。
下面是个东西南北四个方向的LED灯亮灯控制代码。
parameter LED_LEN = 3;output [LED_LEN-1:0] led_east;
output [LED_LEN-1:0] led_south;
output [LED_LEN-1:0] led_west;
output [LED_LEN-1:0] led_north;reg [LED_LEN-1:0] led_east;
reg [LED_LEN-1:0] led_south;
reg [LED_LEN-1:0] led_west;
reg [LED_LEN-1:0] led_north;always @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled_east<={{(LED_LEN-1){1'b1}},1'b0};endelse if(end_e_counter)beginled_east<={led_east[LED_LEN-2:0],led_east[LED_LEN-1]};endelse beginled_east<=led_east;end
endalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled_west<={{(LED_LEN-1){1'b1}},1'b0};endelse if(end_w_counter)beginled_west<={led_west[LED_LEN-2:0],led_west[LED_LEN-1]};endelse beginled_west<=led_west;end
endalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled_south<={{(LED_LEN-1){1'b1}},1'b0};endelse if(end_s_counter)beginled_south<={led_south[LED_LEN-2:0],led_south[LED_LEN-1]};endelse beginled_south<=led_south;end
endalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled_north<={{(LED_LEN-1){1'b1}},1'b0};endelse if(end_n_counter)beginled_north<={led_north[LED_LEN-2:0],led_north[LED_LEN-1]};endelse beginled_north<=led_north;end
end
1.1.5 参考设计代码
module traf_light1(clk ,rst_n ,led_east ,led_south ,led_west ,led_north );parameter LED_LEN = 3;
parameter COUNT_1S = 26'd5000_0000;
parameter COUNT_WID = 28;input clk ;
input rst_n ;
output [LED_LEN-1:0] led_east ;
output [LED_LEN-1:0] led_south;
output [LED_LEN-1:0] led_west ;
output [LED_LEN-1:0] led_north;reg [LED_LEN-1:0] led_east ;
reg [LED_LEN-1:0] led_south;
reg [LED_LEN-1:0] led_west ;
reg [LED_LEN-1:0] led_north;reg [COUNT_WID-1:0] e_counter;
reg [COUNT_WID-1:0] s_counter;
reg [COUNT_WID-1:0] w_counter;
reg [COUNT_WID-1:0] n_counter;wire add_e_counter;
wire end_e_counter;
wire add_w_counter;
wire end_w_counter;
wire add_s_counter;
wire end_s_counter;
wire add_n_counter;
wire end_n_counter;always @(posedge clk or negedge rst_n) begin if (rst_n==0) begine_counter <= 0; endelse if(add_e_counter) beginif(end_e_counter)e_counter <= 0; elsee_counter <= e_counter+1 ;end
end
assign add_e_counter = 1;
assign end_e_counter = add_e_counter && e_counter == COUNT_1S-1 ;always @(posedge clk or negedge rst_n) begin if (rst_n==0) beginw_counter <= 0; endelse if(add_w_counter) beginif(end_w_counter)w_counter <= 0; elsew_counter <= w_counter+1 ;end
end
assign add_w_counter = 1;
assign end_w_counter = add_w_counter && w_counter == 2*COUNT_1S-1 ;always @(posedge clk or negedge rst_n) begin if (rst_n==0) begins_counter <= 0; endelse if(add_s_counter) beginif(end_s_counter)s_counter <= 0; elses_counter <= s_counter+1 ;end
end
assign add_s_counter = 1;
assign end_s_counter = add_s_counter && s_counter == 3*COUNT_1S-1 ;always @(posedge clk or negedge rst_n) begin if (rst_n==0) beginn_counter <= 0; endelse if(add_n_counter) beginif(end_n_counter)n_counter <= 0; elsen_counter <= n_counter+1 ;end
end
assign add_n_counter = 1;
assign end_n_counter = add_n_counter && n_counter == 4*COUNT_1S-1 ;always @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled_east<={{(LED_LEN-1){1'b1}},1'b0};endelse if(end_e_counter)beginled_east<={led_east[LED_LEN-2:0],led_east[LED_LEN-1]};endelse beginled_east<=led_east;end
endalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled_west<={{(LED_LEN-1){1'b1}},1'b0};endelse if(end_w_counter)beginled_west<={led_west[LED_LEN-2:0],led_west[LED_LEN-1]};endelse beginled_west<=led_west;end
endalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled_south<={{(LED_LEN-1){1'b1}},1'b0};endelse if(end_s_counter)beginled_south<={led_south[LED_LEN-2:0],led_south[LED_LEN-1]};endelse beginled_south<=led_south;end
endalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginled_north<={{(LED_LEN-1){1'b1}},1'b0};endelse if(end_n_counter)beginled_north<={led_north[LED_LEN-2:0],led_north[LED_LEN-1]};endelse beginled_north<=led_north;end
endendmodule
1.2 效果和总结
点拨板
1.复位,东西南北四面都是绿灯
2.时间经过1秒后,东面变为黄灯,其余三面还是绿灯
3.时间经过2秒后,东面变为红灯,西面变为黄灯,其余两面不变
4.时间经过3秒后,东面又变回绿灯,南面变为黄灯,西面还是黄灯,北面还是绿灯不变
5.时间经过4秒后,东面循环变为黄灯,南面还是黄灯,西面变为红灯,北面变为黄灯
Mp801
1.复位,东西南北四面都是绿灯
2.时间经过1秒后,东面变为黄灯,其余三面还是绿灯
3.时间经过2秒后,东面变为红灯,西面变为黄灯,其余两面不变
4.时间经过3秒后,东面又变回绿灯,南面变为黄灯,西面还是黄灯,北面还是绿灯不变
5.时间经过4秒后,东面循环变为黄灯,南面还是黄灯,西面变为红灯,北面变为黄灯
实验箱
1.复位,东西南北四面都是绿灯
2.时间经过1秒后,东面变为黄灯,其余三面还是绿灯
3.时间经过2秒后,东面变为红灯,西面变为黄灯,其余两面不变
4.时间经过3秒后,东面又变回绿灯,南面变为黄灯,西面还是黄灯,北面还是绿灯不变
5.时间经过4秒后,东面循环变为黄灯,南面还是黄灯,西面变为红灯,北面变为黄灯
观看上面的现象,可以发现,工程各项功能正常:开发板上东西南北 4 个方向,每个方向上的 3 个 LED 灯按照“绿灯–黄灯–红灯–绿灯–黄灯…”依次循环变化,并且东西南北 4 个方向LED灯变化的速度不同,东面的间隔时间为 1 秒;西面的间隔时间为 2 秒;南面的间隔时间为 3 秒;北面的间隔时间为 4 秒,成功完成设计目标。
感兴趣的朋友也可以访问论坛进行FPGA相关工程设计学习,也欢迎大家在评论进行讨论!
至简设计系列_定时转换的LED交通灯1相关推荐
- 至简设计系列_简易计算器
–作者:小黑同学 本文为明德扬原创及录用文章,转载请注明出处! 1.1 总体设计 1.1.1 概述 计算器是近代人发明的可以进行数字运算的机器.现代的电子计算器能进行数学运算的手持电子机器,拥有集成电 ...
- 至简设计系列_电子密码锁
–作者:肖肖肖 本文为明德扬原创及录用文章,转载请注明出处! 1.1 总体设计 1.1.1 概述 随着生活质量的不断提高,加强家庭防盗安全变得非常重要,但传统机械锁的构造过于简单,很容易被打开,从而降 ...
- led计数电路实验报告_至简设计系列_状态机实现LED交通灯2
--作者:肖肖肖 本文为明德扬原创及录用文章,转载请注明出处! 1.1 总体设计 1.1.1 概述 发光二极管简称为LED,是一种常用的发光器件,通过电子与空穴复合释放能量发光,可以高效的将电能转化为 ...
- 至简设计系列_按键控制数字时钟
–作者:小黑同学 本文为明德扬原创及录用文章,转载请注明出处! 1.1 总体设计 1.1.1 概述 数字时钟是采用数字电路技术实现时.分.秒计时显示的装置,可以用数字同时显示时,分,秒的精确时间并实现 ...
- 8盏流水灯反向闪烁c语言,课程设计(论文)_利用8255A芯片实现流水灯闪烁设计.doc...
课程设计(论文)_利用8255A芯片实现流水灯闪烁设计 利用8255A芯片实现流水灯闪烁设计 27 - 目录 摘要··········································· ...
- 【花雕动手做】有趣好玩的音乐可视化系列项目(28)--LED乒乓球灯
偶然心血来潮,想要做一个音乐可视化的系列专题.这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,逐步积累 ...
- ewb交通灯报告和文件_基于ewb平台的交通灯电路设计.doc
基于ewb平台的交通灯电路设计.doc 电子技术课程设计题目基于EWB平台的交通灯电路设计指导教师班级电子082姓名学号2008成绩时间第十八周一.课程设计的目的1掌握交通灯控制电路的设计.组装与调试 ...
- led大屏按实际尺寸设计画面_主楼大报告厅LED屏幕使用须知
为了更好地保障主楼报告厅各类会议.活动的开展,进一步规范厅内LED屏幕的使用,确保画面正常显示不变形,我部根据实际比例制作了相应背景图片模板供大家参考,借用单位可直接下载编辑后使用,也可按照比例自行设 ...
- 数字电路硬件设计系列(八)之LED电路设计
针对设计过程中的问题,如有疑问,欢迎留言评论!点我返回目录 1 简介 LED在电路中的应用十分广泛,其主要功能是指示系统运行状态.常见的应用场景有: 电源指示功能,用于指示上电是否正常. MUC指示灯 ...
最新文章
- java map在前端遍历_遍历循环输出map的几种方式
- SpringBoot启动项目时提示:Error:(3, 32) java: 程序包org.springframework.boot不存在
- asp.net中退出登陆的相关问题(解决后退或直接粘贴地址进入网页的问题)
- eui加载时间长_面试官:为什么 HashMap 的加载因子是0.75?
- docker privileged作用_docker总结
- 一门从业4年都没能用上的优化技术
- LeetCode 226 翻转二叉树
- centos 6上安装使用saltstack以及基础管理
- VeryCD将于本月关闭 P2P历史即将终结
- java 加密 压缩_如何用java 将文件加密压缩为zip文件.
- 移动端APM网络监控与优化实践
- 三位数的茎叶图怎么看_如何看懂茎叶图
- P1357 食物链(一)
- SQL Server数据误删恢复
- 人人网发布啵啵: 带语音滤镜的语音社交产品
- 二.java-jak和jre安装与配置
- 苏宁易购商品详情API接口
- python数据库开发 dga_DGA detection based on Deep Learning (CNN and GRU) (基于深度学习的DGA检测)...
- 域名信息备案管理系统php,工信部备案系统域名变更已启用新域名
- windows 删除文件夹 拒绝访问
热门文章
- CUDA out of memory 解决办法
- 数据分析之“设立标准、判断分类”
- 应用程序无法正常启动(0xc00…
- 【宇麦科技】十大基于风险的漏洞管理工具
- Go 语言又称 Golang,是谷歌(Google)开发的一种静态强类型、编译型、并发型的编程语言。2009 年 11 月 10 日,Go 语言以开源方式向全球发布,如今许多大公司纷纷选择使用 Go
- svn服务器如何查询文档,windows 查看svn服务器
- Thingworx入门笔记
- 动态壁纸小程序源码带流量主壁纸分享类小程序源码
- 基于vue的iviewui组件应用和封装开发
- 乐播投屏开始收费了,一年费用100万?使用的开发商注意