–作者:肖肖肖
本文为明德扬原创及录用文章,转载请注明出处!

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 概述 计算器是近代人发明的可以进行数字运算的机器.现代的电子计算器能进行数学运算的手持电子机器,拥有集成电 ...

  2. 至简设计系列_电子密码锁

    –作者:肖肖肖 本文为明德扬原创及录用文章,转载请注明出处! 1.1 总体设计 1.1.1 概述 随着生活质量的不断提高,加强家庭防盗安全变得非常重要,但传统机械锁的构造过于简单,很容易被打开,从而降 ...

  3. led计数电路实验报告_至简设计系列_状态机实现LED交通灯2

    --作者:肖肖肖 本文为明德扬原创及录用文章,转载请注明出处! 1.1 总体设计 1.1.1 概述 发光二极管简称为LED,是一种常用的发光器件,通过电子与空穴复合释放能量发光,可以高效的将电能转化为 ...

  4. 至简设计系列_按键控制数字时钟

    –作者:小黑同学 本文为明德扬原创及录用文章,转载请注明出处! 1.1 总体设计 1.1.1 概述 数字时钟是采用数字电路技术实现时.分.秒计时显示的装置,可以用数字同时显示时,分,秒的精确时间并实现 ...

  5. 8盏流水灯反向闪烁c语言,课程设计(论文)_利用8255A芯片实现流水灯闪烁设计.doc...

    课程设计(论文)_利用8255A芯片实现流水灯闪烁设计 利用8255A芯片实现流水灯闪烁设计 27 - 目录 摘要··········································· ...

  6. 【花雕动手做】有趣好玩的音乐可视化系列项目(28)--LED乒乓球灯

    偶然心血来潮,想要做一个音乐可视化的系列专题.这个专题的难度有点高,涉及面也比较广泛,相关的FFT和FHT等算法也相当复杂,不过还是打算从最简单的开始,实际动手做做试验,耐心尝试一下各种方案,逐步积累 ...

  7. ewb交通灯报告和文件_基于ewb平台的交通灯电路设计.doc

    基于ewb平台的交通灯电路设计.doc 电子技术课程设计题目基于EWB平台的交通灯电路设计指导教师班级电子082姓名学号2008成绩时间第十八周一.课程设计的目的1掌握交通灯控制电路的设计.组装与调试 ...

  8. led大屏按实际尺寸设计画面_主楼大报告厅LED屏幕使用须知

    为了更好地保障主楼报告厅各类会议.活动的开展,进一步规范厅内LED屏幕的使用,确保画面正常显示不变形,我部根据实际比例制作了相应背景图片模板供大家参考,借用单位可直接下载编辑后使用,也可按照比例自行设 ...

  9. 数字电路硬件设计系列(八)之LED电路设计

    针对设计过程中的问题,如有疑问,欢迎留言评论!点我返回目录 1 简介 LED在电路中的应用十分广泛,其主要功能是指示系统运行状态.常见的应用场景有: 电源指示功能,用于指示上电是否正常. MUC指示灯 ...

最新文章

  1. java map在前端遍历_遍历循环输出map的几种方式
  2. SpringBoot启动项目时提示:Error:(3, 32) java: 程序包org.springframework.boot不存在
  3. asp.net中退出登陆的相关问题(解决后退或直接粘贴地址进入网页的问题)
  4. eui加载时间长_面试官:为什么 HashMap 的加载因子是0.75?
  5. docker privileged作用_docker总结
  6. 一门从业4年都没能用上的优化技术
  7. LeetCode 226 翻转二叉树
  8. centos 6上安装使用saltstack以及基础管理
  9. VeryCD将于本月关闭 P2P历史即将终结
  10. java 加密 压缩_如何用java 将文件加密压缩为zip文件.
  11. 移动端APM网络监控与优化实践
  12. 三位数的茎叶图怎么看_如何看懂茎叶图
  13. P1357 食物链(一)
  14. SQL Server数据误删恢复
  15. 人人网发布啵啵: 带语音滤镜的语音社交产品
  16. 二.java-jak和jre安装与配置
  17. 苏宁易购商品详情API接口
  18. python数据库开发 dga_DGA detection based on Deep Learning (CNN and GRU) (基于深度学习的DGA检测)...
  19. 域名信息备案管理系统php,工信部备案系统域名变更已启用新域名
  20. windows 删除文件夹 拒绝访问

热门文章

  1. CUDA out of memory 解决办法
  2. 数据分析之“设立标准、判断分类”
  3. 应用程序无法正常启动(0xc00…
  4. 【宇麦科技】十大基于风险的漏洞管理工具
  5. Go 语言又称 Golang,是谷歌(Google)开发的一种静态强类型、编译型、并发型的编程语言。2009 年 11 月 10 日,Go 语言以开源方式向全球发布,如今许多大公司纷纷选择使用 Go
  6. svn服务器如何查询文档,windows 查看svn服务器
  7. Thingworx入门笔记
  8. 动态壁纸小程序源码带流量主壁纸分享类小程序源码
  9. 基于vue的iviewui组件应用和封装开发
  10. 乐播投屏开始收费了,一年费用100万?使用的开发商注意