简介:
设计一个交通灯控制器,在数码管上以红、黄、绿三种颜色显示当前状态的剩余时间。持续时间分别为:红灯30s,黄灯5s,绿灯30s。初始为红灯,依次变为绿灯、黄灯、红灯循环显示。输入时钟为1k Hz。
系统设计:
分析需求,可将交通控制器系统划分为generate_1s、controller、counter、splitter和decoder5_7共五个模块实现。
交通灯控制器顶层框图如下:

controller状态转移图如下:

Verilog完整代码实现如下:

/*-------------------------------------------------
Filename: traffic_light_controller.v
Function: 交通灯控制器顶层模块(用于综合成实际电路)
Author: Zhang Kaizhou
Date: 2019-11-17 14:28:50
-------------------------------------------------*/
`include "generate_1s.v"
`include "counter.v"
`include "controller.v"
`include "splitter.v"
`include "decoder5_7.v"
module traffic_light_controller(sys_clk, reset, data_high, data_low, state);//输入输出端口定义input sys_clk, reset;output [1 : 0] state;output [6 : 0] data_high, data_low;//内部寄存器及连线定义wire count_clk;wire [6 : 0] data;wire [3 : 0] data_shi, data_ge;//逻辑实现generate_1s        generate_1s_m0(.sys_clk(sys_clk), .reset(reset), .y(count_clk));counter         counter_m0(.count_clk(count_clk), .reset(reset), .data(data));controller        controller_m0(.clk(count_clk), .reset(reset), .din(data), .state(state));splitter       splitter_m0(.data(data), .data_shi(data_shi), .data_ge(data_ge));decoder5_7     decoder5_7_m0(.reset(reset), .data_shi(data_shi), .data_ge(data_ge), .data_high(data_high), .data_low(data_low));
endmodule
/*--------------------------------------
Filename: generate_1s.v
Function: 将1kHz系统时钟分频产生1Hz时钟
Author: Zhang Kaizhou
Date: 2019-11-17 14:28:56
--------------------------------------*/
module generate_1s(sys_clk, reset, y);//定义输入输出端口input sys_clk, reset;output y;//内部寄存器定义reg y;reg [9 : 0] cnt;//逻辑实现always@(posedge sys_clk or negedge reset)beginif(!reset)beginy <= 1'b0;cnt <= 10'd0;endelsebeginif(cnt == 10'd999)beginy <= 1'b1;cnt <= 10'd0;endelsebeginy <= 1'b0;cnt <= cnt + 1;endendend
endmodule
/*---------------------------------------------
Filename: counter.v
Function: 7位循环减计数器(用于倒计时和状态转移)
Author: Zhang Kaizhou
Date: 2019-11-17 14:29:01
---------------------------------------------*/
module counter(count_clk, reset, data);//输入输出端口定义input count_clk, reset;output [6 : 0] data; //64~35, 34~5, 4~0循环减计数//内部寄存器定义reg [6 : 0] data;//逻辑实现always@(posedge count_clk or negedge reset)beginif(!reset) data <= 7'd64; //异步复位else if(data == 7'd0) data <= 7'd64;else data <= data - 7'd1;end
endmodule
/*-------------------------------------------------
Filename: controller.v
Function: 整个电路的控制模块(用FSM实现)
Author: Zhang Kaizhou
Date: 2019-11-17 14:29:06
-------------------------------------------------*/
module controller(clk, reset, din, state);//定义输入输出端口input clk, reset;input [6 : 0] din;output [1 : 0] state;//内部寄存器定义reg [1 : 0] state, current_state, next_state;//状态编码parameter red = 2'b00, green = 2'b01, yellow = 2'b10;//时序逻辑实现状态转移always@(posedge clk or negedge reset)beginif(!reset) current_state <= red;else current_state <= next_state;end//组合逻辑实现转移条件判断always@(current_state or din)begincase(current_state)red: next_state = (din == 7'd35) ? green : red;green: next_state = (din == 7'd5) ? yellow : green;yellow: next_state = (din == 7'd0) ? red : yellow;endcaseend//组合逻辑实现输出always@(current_state)begincase(current_state)red: state = 2'b00;green: state = 2'b01;yellow: state = 2'b10;endcaseend
endmodule
/*------------------------------------------------------------
Filename: splitter.v
Function: 将输入的7位二进制数转换成2个4位的BCD码(分离十位和个位)
Author: Zhang Kaizhou
Date: 2019-11-17 14:29:10
------------------------------------------------------------*/
module splitter(data, data_shi, data_ge);//输入输出端口定义input [6 : 0] data;output [3 : 0] data_shi;output [3 : 0] data_ge;//内部寄存器定义reg [3 : 0] data_shi, data_ge;reg [6 : 0] data_display;//显示数据转换always@(data)beginif(data >= 7'd35) data_display = data - 7'd35;else if(data >= 7'd5) data_display = data - 7'd5;else data_display = data;end//用左移加3法将7位二进制数转换为两个4位的BCD码integer i;always@(data)begindata_shi = 4'd0;data_ge = 4'd0;for(i = 6; i >= 0; i = i - 1)beginif(data_ge >= 4'd5) data_ge = data_ge + 4'd3;if(data_shi >= 4'd5) data_shi = data_shi + 4'd3;data_shi = data_shi << 1;data_shi[0] = data_ge[3];data_ge = data_ge << 1;data_ge[0] = data_display[i];endend
endmodule
/*------------------------------------------------
Filename: decoder5_7.v
Function: 将4位BCD码数据转换为7段数码管的显示数据
Author: Zhang Kaizhou
Date: 2019-11-17 14:29:16
------------------------------------------------*/
module decoder5_7(reset, data_shi, data_ge, data_high, data_low);//输入输出端口定义input reset;input [3 : 0] data_shi, data_ge;output [6 : 0] data_high, data_low;//内部寄存器定义reg [6 : 0] data_high, data_low;//译码个位数always@(reset or data_ge)beginif(!reset)begindata_high <= 7'b0000110; //7'h06data_low <= 7'b0000001; //7'h01endelsebegincase(data_ge)4'd0: data_low <= 7'b0000001; //7'h014'd1: data_low <= 7'b1001111; //7'h4f4'd2: data_low <= 7'b0010010; //7'h124'd3: data_low <= 7'b0000110; //7'h064'd4: data_low <= 7'b1001100; //7'h4c4'd5: data_low <= 7'b0101100; //7'h2c4'd6: data_low <= 7'b0100000; //7'h204'd7: data_low <= 7'b0001111; //7'h0f4'd8: data_low <= 7'b0000000; //7'h004'd9: data_low <= 7'b0000100; //7'h04default: data_low <= 7'b0110000; //7'h48endcaseendend//译码十位数always@(reset or data_shi)beginif(!reset)begindata_high <= 7'b0000110; //7'h06data_low <= 7'b0000001; //7'h01endelsebegincase(data_shi)4'd0: data_high <= 7'b0000001; //7'h014'd1: data_high <= 7'b1001111; //7'h4f4'd2: data_high <= 7'b0010010; //7'h124'd3: data_high <= 7'b0000110; //7'h06default: data_high <= 7'b0110000; //7'h48endcaseendend
endmodule
/*---------------------------------------------------------
Filename: top_t.v
Function: 交通灯控制器整个系统的顶层测试文件(用于仿真测试)
Author: Zhang Kaizhou
Date: 2019-11-17 14:29:23
---------------------------------------------------------*/
`timescale 1ms/100us
`define sys_clk_half_period 0.5 //系统时钟频率为1kHz,其半周期为0.5ms
`include "generate_1s.v"
`include "counter.v"
`include "controller.v"
`include "splitter.v"
`include "decoder5_7.v"
module top_t(data_high, data_low, state);//输入输出端口定义output [1 : 0] state;output [6 : 0] data_high, data_low;//内部寄存器及连线定义reg sys_clk, reset;wire count_clk;wire [6 : 0] data;wire [3 : 0] data_shi, data_ge;//产生测试信号initialbeginsys_clk = 0;#5 reset = 1;#5 reset = 0;#9.5 reset = 1;#120000 $stop; //仿真120s停止end//产生1kHz的系统时钟sys_clkalways #`sys_clk_half_period sys_clk = ~sys_clk;//结构描述generate_1s      generate_1s_m0(.sys_clk(sys_clk), .reset(reset), .y(count_clk));counter         counter_m0(.count_clk(count_clk), .reset(reset), .data(data));controller        controller_m0(.clk(count_clk), .reset(reset), .din(data), .state(state));splitter       splitter_m0(.data(data), .data_shi(data_shi), .data_ge(data_ge));decoder5_7     decoder5_7_m0(.reset(reset), .data_shi(data_shi), .data_ge(data_ge), .data_high(data_high), .data_low(data_low));
endmodule

ModelSim10.4仿真结果:

总结:
由上面的仿真结果可知,本次设计的交通灯控制电路实现了,在输入1kHz时钟的驱动下,在数码管上以红、黄、绿(状态编码分别为2’d0、2’d1、2’d2)三种颜色显示当前状态的剩余时间。持续时间分别为:红灯30s,黄灯5s,绿灯30s。初始为红灯,依次变为绿灯、黄灯、红灯循环显示。相应的数码管驱动数据也正确。完成了设计预期。

Verilog 交通灯控制器相关推荐

  1. 基于Verilog用状态机设计交通灯控制器

    1.题目:用状态机设计交通灯控制器,设计要求:A路和B路都有红.黄.绿三种灯,持续时间为红灯45s.黄灯5s.绿灯40s.A路和B路交通灯的状态转移为 (1)A红,B绿(持续时间40s): (2)A红 ...

  2. 交通灯控制器的verilog实现

    用状态机实现交通灯控制器,仿真通过,有代码以及testbench. 要求: 方向1是主干道,绿灯时间较长,交通灯状态循环为: 绿:40 黄:5 左:15 黄:5 红:55 方向2不是主干道,绿灯时间较 ...

  3. FPGA智能交通灯控制器系统系统设计

    1系统总体设计 把由5OM的有源晶振产生的现场可编程逻辑器件FPGA 的系统时钟输入到分频模块,经分频模块分频产生频率为1Hz的时钟脉冲,作为控制定时模块.控制模块.紧急模块.计数模块的时钟信号,然后 ...

  4. VHDL交通灯控制器的设计

    主要内容: 设计主干道的交叉路口交通信号灯无人自动管理的控制系统.将路口红绿灯的各种亮灯情况定义不同的状态,路口状况定义为触发条件,组成有限状态机. 1.设计的目的 本次课程设计的目的是通过设计交通灯 ...

  5. eda交通灯控制器波形输入_基于VHDL的交通灯控制器设计

    应用VHDL语言设计数字系统,大部分设计工作可在计算机上完成,从而缩短系统开发时间,提高工作效率.下面介绍基于VHDL设计交通灯控制器的一种方案,并给出源程序和仿真结果. 1 系统功能与要求 交通灯控 ...

  6. 微机原理与接口技术 8255和8253综合应用之交通灯控制器的设计

    交通灯控制器的设计 一.实验要求 通过采用并行口8255A和定时器/计数器8253编写一模仿交通灯程序,在微机原理实验仪上调试,运行后可以看到LED灯在不停的红绿交替亮. 二.实验目的: 熟悉和掌握并 ...

  7. 一位全加器的设计和交通灯控制器EDA

    一.实验内容 1)熟悉quartusll开发环境 2)一位全加器的设计和交通灯控制器. FPGA为核心,设计一个交通灯控制器,每个路口都有红.黄.绿三盏灯.该交通信号灯控制器由一条车道A和一条车道B汇 ...

  8. CASE_01 基于FPGA的交通灯控制器

        该系类博客序言和资源简介可浏览该博客:PREFACE FPGA经典案例序言 快速了解该系列博客的内容与可用 资源. 目录 1 案例引导 1.1 硬件设计初窥 1.2 逻辑设计初窥 2 模块级逻 ...

  9. Verilog交通灯控制模块

    简介: 用Verilog编写行为模块模拟交通灯的控制时序.[注]该代码不可综合成电路网表. 代码实现: /*---------------------------------------------- ...

  10. VHDL设计交通灯控制器的课程设计

    交通灯控制 设计要求:设计一个交通灯控制, 1当乡村公路无车时始终保持乡村公路红灯亮,主干道绿灯亮. 2当乡村公路有车时,而主干道通车时间已经超过他的最短通车时间时,禁止主干道通车,让乡村公路通行.主 ...

最新文章

  1. Webpack 源码学习系列(一)
  2. css之object-fit
  3. [置顶] ProDinner体验
  4. BZOJ 4241: 历史研究
  5. 上海Oracle高峰会感悟
  6. Linux gdb多进程、多线程调试
  7. NCBI SRA数据预处理
  8. 企业实战05:Oracle数据库_操作表中数据
  9. php识别html5,CSS_在IE6/7/8下识别html5标签(让老式浏览器识别html5),识别html5标签: html5添加了许 - phpStudy...
  10. 微信iOS版本推出深色模式,网友:终于可以“好好熬夜”了!
  11. 模线性同余方程组求解
  12. Mybatis动态数据源
  13. JEPLUS表格高级展示——JEPLUS软件快速开发平台
  14. Camera 初始化(Preview) 二(HAL3的流程)
  15. 扫地机器人基本设计方案
  16. VMWare、Ubuntu、ROS安装参考汇总
  17. 七大江河水系--黄河(一)
  18. 如何精确计算 LoRaWAN 终端电池寿命
  19. 百度Q3财报公布,O2O转型志在必得
  20. Android FTP功能开发基于swiftp

热门文章

  1. mac homebrew安装php,Mac Mojava 通过 homebrew 安装 PHP5.6 版本正确姿势
  2. flink-metric原理与实战
  3. 手写解析微信Matrix性能监控日志的工具
  4. cba比赛比分预测_昨日预测CBA一红一黑,今日继续给大家带来CBA全部比赛4场
  5. Kinect图像成像原理
  6. 人工智能贬为人工智障,揭下“伪装”的智能产品
  7. Android-Material-Sloth
  8. 【IT职业】IT人的职业规划
  9. Android手机安装.pem证书文件
  10. 安徽科技学院 信网学院网络文化节 陈鑫鑫