疫情无情,人间有情,武汉加油,

在家里,无所事事,把以前的课设给放到网上吧,也顺便复习一下。

就贴了一下代码,不是太详细,你们都是聪明人,一下子肯定看懂了!

题目是这样子的

信号控制系统设计

内容及要求:

设计一个十字路口交通控制系统,具体设计要求如下:

(1)东西(用A表示)、南北(用B表示)方向均有绿灯、黄灯、红灯指示,其持续时间分别是40秒、5秒和45秒, 交通灯运行的切换示意图和时序图分别如图1、图2所示。

(2)系统设有时钟,以倒计时方式显示每一路允许通行的时间。

(3)当东西或南北两路中任一路出现特殊情况时,系统可由交警手动控制立即进入特殊运行状态,即红灯全亮,时钟停止计时,东西、南北两路所有车辆停止通行;当特殊运行状态结束后,系统恢复工作,继续正常运行。

图2  交通灯时序图

(4)完成全部流程:设计规范文档、模块设计、代码输入、下载验证等,最后就课程设计本身提交一篇课程设计报告。

这是交通灯的时序模块

主要的是完成交通灯的时序模块,注释很少,忘见谅!

module traffic_led(  input   sys_clk,input   sys_rst_n,input   en,      //使能标记位output reg  greenA, //LED灯output reg  greenB,output reg  redA,output reg  redB,output reg  yellowA,output reg  yellowB,output  reg [5:0]  timeA,output  reg [5:0]  timeB
);//parameter NUM_MAX=26'd50_000_000; //1s延迟
parameter NUM_MAX=26'd50_000; //1ms,仿真时用的,1s太长了parameter state0=4'b0001;
parameter state1=4'b0010;
parameter state2=4'b0100;
parameter state3=4'b1000;reg [25:0] count; //延时1s  20ns  1000_000_000/20ns=50_000_000次
reg        s_flag;//秒标记位
reg [5:0]  count45; //45s延时
reg        flag45;  //45s标记位reg [3:0]  current_state;
reg [3:0]  next_state;//1s延时函数
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)count <=26'd0;else  if(en) beginif(count < NUM_MAX-1'b1) begincount <= count + 1'b1;s_flag<=1'b0;endelse begins_flag<=1'b1;count<=26'd0;end    endelse count <=  count;
end//45s延时
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n) begin count45 <=6'd45;flag45 <=1'b0;end else if(en) begin if(s_flag) beginif(count45 == 6'b1) begin count45 <=6'd45;flag45 <=1'b1;endelse begincount45<=count45 - 1'b1;flag45 <=1'b0;endend else begincount45 <= count45;flag45 <= flag45;endendelse begincount45 <=count45;flag45  <=flag45;endend/*这是用状态机实现的,我使用的是两段式*///状态的跳转(时序逻辑)
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)current_state<=state0;elsecurrent_state <= next_state;
end//各个状态的下动作
always @(posedge sys_clk) beginif(en)begin   case(current_state)state0:beginif(count45 == 6'd5)next_state=state1;else begin greenA <=1'b0;greenB <=1'b1;redA   <=1'b1;redB   <=1'b0;yellowA<= 1'b1;yellowB <=1'b1;timeA  <=count45;timeB  <=6'd0;endendstate1:beginif(flag45) next_state=state2;else begin                     greenA <=1'b1;greenB <=1'b1;redA   <=1'b1;redB   <=1'b0;yellowA<= 1'b0;yellowB <=1'b1;timeA  <=count45;timeB  <=6'd0;                        endendstate2:beginif(count45 == 6'd5) next_state=state3;else begin greenA <=1'b1;greenB <=1'b0;redA   <=1'b0;redB   <=1'b1;yellowA<= 1'b1;yellowB <=1'b1;timeA  <= 6'd0;timeB  <=count45;end endstate3:beginif(flag45) next_state=state0;                       else begin  greenA <=1'b1;greenB <=1'b1;redA   <=1'b0;redB   <=1'b1;yellowA<= 1'b1;yellowB <=1'b0;timeA  <= 6'd0;timeB  <=count45;endenddefault:next_state=state0;endcaseendelse begingreenA <=1'b1;greenB <=1'b1;redA   <=1'b0;redB   <=1'b0;yellowA<= 1'b1;yellowB <=1'b1;end
endendmodule

数码管显示模块

这个代码我是采用正点原子的数码管显示模块的代码,只是进行了一下简单的修改。

/*数码管显示模块*/
module seg_led(input                   sys_clk    ,        // 时钟信号input                   sys_rst_n  ,        // 复位信号input         [5:0]     timeA,input         [5:0]     timeB,      input         [3:0]     point  ,        // 小数点具体显示的位置,从高到低,高电平有效input                   en     ,        // 数码管使能信号input                   sign   ,        // 符号位(高电平显示“-”号)output   reg  [3:0]     seg_sel,        // 数码管位选,最左侧数码管为最高位output   reg  [7:0]     seg_led         // 数码管段选
);//分频参数
localparam CLK_DIVIDE=4'd10;
localparam MAX_NUM =13'd5000;  //10分频,用于1ms计时reg    [3:0]             clk_cnt  ;        // 时钟分频计数器,十分频,计数5个系统周期
reg                      dri_clk  ;        // 数码管的驱动时钟,5MHz 200ns
reg    [15:0]            num;              //要显示的BCD数字
reg    [12:0]            cnt0;  // 数码管驱动时钟计数器,1000_000ns/200ns=5000 13bit
reg                      flag;        // 标志信号(标志着cnt0计数达1ms)
reg    [1:0]             cnt_sel  ;        // 数码管位选计数器
reg    [3:0]             num_disp ;        // 当前数码管显示的数据
reg                      dot_disp ;        // 当前数码管显示的小数点//拆分显示
wire   [3:0]              data0    ;        // 个位数9 4bit
wire   [3:0]              data1    ;        // 十位数
wire   [3:0]              data2    ;        // 百位数
wire   [3:0]              data3    ;        // 千位数assign data0 = timeA % 4'd10;
assign data1 = timeA /4'd10;
assign data2 = timeB % 4'd10;
assign data3 = timeB / 4'd10;//对系统时钟10分频(1 5个系统周期 0 5个系统周期),得到的频率为5Mhz的数码管驱动时钟 200ms
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n) beginclk_cnt <= 4'b0;dri_clk <= 1'b1; //信号开始为1endelse if(clk_cnt==CLK_DIVIDE/2-1'b1) beginclk_cnt <= 4'b0;dri_clk <= ~dri_clk;endelse beginclk_cnt <=clk_cnt + 1'b1;dri_clk <= dri_clk;end
end//将14位2进制数转换为8421bcd码(即使用4位二进制数表示1位十进制数)
always @(posedge dri_clk or negedge sys_rst_n) beginif(!sys_rst_n)num <= 16'b0;else beginif(!point[3]) beginnum[15:12] <= data3;num[11:8]  <= data2;num[ 7:4]  <= data1;num[ 3:0]  <= data0;endelse beginif(data2 || point[2]) beginnum[11:0]<={data2,data1,data0};if(sign)num[15:12] <= 4'd11;//d11表示负号elsenum[15:12] <= 4'd0;     endelse beginif(data1 || point[1]) beginnum[15:12] <= 4'd10;num[7:0]<={data1,data0};if(sign)num[11:8] <= 4'd11;//d11表示负号elsenum[11:8] <= 4'd0;endelse beginnum[15:12] <= 4'd10;num[11:8] <= 4'd10;num[3:0]<= data0;if(sign)num[7:4] <= 4'd11;//d11表示负号elsenum[7:4] <= 4'd0;endendend    end
end//数码管驱动时钟,计时1ms,输出一个时钟周期的脉冲信号flag
always @ (posedge dri_clk or negedge sys_rst_n) beginif(!sys_rst_n) begincnt0 <=13'b0;flag <=1'b0;endelse if(cnt0 < MAX_NUM -1'b1) begincnt0 <=cnt0 + 1'b1;flag <= 1'b0;endelse beginflag <= 1'b1;cnt0 <= 1'b0;end
end//cnt_sel从0计数到3,用于选择当前处于显示状态的数码管always @ (posedge dri_clk or negedge sys_rst_n) beginif(!sys_rst_n) cnt_sel <= 2'b0;else if(flag) beginif(cnt_sel < 3)cnt_sel=cnt_sel+1'b1;elsecnt_sel <= 2'b0;endelsecnt_sel <=cnt_sel;
end//进行循环位选
always @ (posedge dri_clk or negedge sys_rst_n) beginif(!sys_rst_n) beginseg_sel  <= 4'b1111;              //位选信号低电平有效num_disp <= 4'd10;           //默认不显示dot_disp <= 1'b1;  //默认不显示小数点endelse beginif(en) begincase (cnt_sel)2'd0 :beginseg_sel  <= 4'b1110;  //显示数码管最低位num_disp <= num[3:0] ;  //显示的数据dot_disp <= ~point[0];  //显示的小数点end2'd1 :beginseg_sel  <= 'b1101;  //显示数码管第1位num_disp <= num[7:4] ;dot_disp <= ~point[1];end2'd2 :beginseg_sel  <= 4'b1011;  //显示数码管第2位num_disp <= num[11:8];dot_disp <= ~point[2];end2'd3 :beginseg_sel  <= 4'b0111;  //显示数码管第3位num_disp <= num[15:12];dot_disp <= ~point[3];enddefault: beginseg_sel  <= 4'b1111;              //位选信号低电平有效num_disp <= 4'd10;           //默认dot_disp <= 1'b1;  //默认不显示小数点endendcaseendelse beginseg_sel  <= 4'b1111;              //位选信号低电平有效num_disp <= 4'd10;           //默认显示dot_disp <= 1'b1;  //默认不显示小数点endend
endalways @ (posedge dri_clk or negedge sys_rst_n) beginif (!sys_rst_n)seg_led <= 8'hc0;else begincase(num_disp)4'd0 : seg_led <= {dot_disp,7'b1000000}; //显示数字 04'd1 : seg_led <= {dot_disp,7'b1111001}; //显示数字 14'd2 : seg_led <= {dot_disp,7'b0100100}; //显示数字 24'd3 : seg_led <= {dot_disp,7'b0110000}; //显示数字 34'd4 : seg_led <= {dot_disp,7'b0011001}; //显示数字 44'd5 : seg_led <= {dot_disp,7'b0010010}; //显示数字 54'd6 : seg_led <= {dot_disp,7'b0000010}; //显示数字 64'd7 : seg_led <= {dot_disp,7'b1111000}; //显示数字 74'd8 : seg_led <= {dot_disp,7'b0000000}; //显示数字 84'd9 : seg_led <= {dot_disp,7'b0010000}; //显示数字 94'd10: seg_led <= 8'b11111111;           //不显示任何字符4'd11: seg_led <= 8'b10111111;           //显示负号(-)default:seg_led <={dot_disp,7'b11111111};//其他不显示endcaseend
endendmodule

按键的延迟模块

主要是用于开始或停止按钮的消抖

module key_debounce(input            sys_clk,          //外部50M时钟input            sys_rst_n,        //外部复位信号,低有效input            key,              //外部按键输入output reg       key_flag,         //按键数据有效信号output reg       key_value         //按键消抖后的数据  );//reg define
reg [31:0] delay_cnt;
reg        key_reg;//*****************************************************
//**                    main code
//*****************************************************
always @(posedge sys_clk or negedge sys_rst_n) begin if (!sys_rst_n) begin key_reg   <= 1'b1;delay_cnt <= 32'd0;endelse beginkey_reg <= key;if(key_reg != key)             //一旦检测到按键状态发生变化(有按键被按下或释放)delay_cnt <= 32'd1000000;  //给延时计数器重新装载初始值(计数时间为20ms)else if(key_reg == key) begin  //在按键状态稳定时,计数器递减,开始20ms倒计时if(delay_cnt > 32'd0)delay_cnt <= delay_cnt - 1'b1;elsedelay_cnt <= delay_cnt;end           end
endalways @(posedge sys_clk or negedge sys_rst_n) begin if (!sys_rst_n) begin key_flag  <= 1'b0;key_value <= 1'b1;          endelse beginif(delay_cnt == 32'd1) begin   //当计数器递减到1时,说明按键稳定状态维持了20mskey_flag  <= 1'b1;         //此时消抖过程结束,给出一个时钟周期的标志信号key_value <= key;          //并寄存此时按键的值endelse beginkey_flag  <= 1'b0;key_value <= key_value; end  end
endendmodule 

顶层模块

这个模块主要实现的是实例化三个模块,设置一个开始或停止按钮,就是紧急接管按钮。

module trafficlight(input  sys_clk,input  sys_rst_n,input  key,      //开始或停止交通灯output  greenA,output  greenB,output  redA,output  redB,output  yellowA,output  yellowB,output     [3:0]     seg_sel,        // 数码管位选,最左侧数码管为最高位output     [7:0]     seg_led         // 数码管段选
);parameter  POINT=4'd0000;
parameter  SIGN=1'b0;wire [5:0] timeA;
wire [5:0] timeB;
wire    key_flag;
wire    key_value;
reg     en;//开始或停止交通灯
always @ (posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)  en<=1'b1;else begin  if(key_flag && (~key_value))  //判断按键是否有效按下en<=~en;else en<=en;end
endtraffic_led u_traffic_led(   .sys_clk(sys_clk),.sys_rst_n(sys_rst_n),.greenA(greenA),.greenB(greenB),.redA(redA),.redB(redB),.yellowA(yellowA),.yellowB(yellowB),.en(en),.timeA(timeA),.timeB(timeB)
);seg_led u_seg_led(.sys_clk(sys_clk)    ,        // 时钟信号.sys_rst_n(sys_rst_n)  ,        // 复位信号.timeA(timeA),.timeB(timeB),      // 6位数码管要显示的数值.point( POINT)  ,        // 小数点具体显示的位置,从高到低,高电平有效.en(en)     ,        // 数码管使能信号.sign(SIGN)   ,        // 符号位(高电平显示“-”号).seg_sel(seg_sel),        // 数码管位选,最左侧数码管为最高位.seg_led(seg_led)         // 数码管段选
);key_debounce u_key_debounce(.sys_clk(sys_clk),          //外部50M时钟.sys_rst_n(sys_rst_n),        //外部复位信号,低有效.key(key),              //外部按键输入.key_flag(key_flag),         //按键数据有效信号.key_value(key_value)         //按键消抖后的数据  );endmodule

这样就ok了,简单吧!

仿真图

下面是仿真图,仿真的时间我使用的是毫秒为单位,一秒太长了,仿真太麻烦

这是绿灯仿真时间,40s

这是红灯的仿真时间,45s

这是绿灯仿真时间,5s

差不多就这样了

基于FPGA的交通灯设计相关推荐

  1. 基于FPGA的交通灯设计与实现

    EDA工具:Modelsim and Vivado ##一.产品要求: 该控制器用于主干道和支道公路交叉口,优先保证主干道通行,平时处于"主干道绿灯,支道红灯"状态,支道有车辆要穿 ...

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

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

  3. 基于FPGA的交通灯系统

    基于FPGA的交通灯系统 一.实验目的 1.学习和掌握将实践中的要求抽象为逻辑需求关系的方法. 2.掌握将小型数字系统划分为控制器和处理器的方法. 3.掌握依据ASM图设计小型数字系统的方法 4.掌握 ...

  4. 基于FPGA的呼吸灯设计

    一:背景介绍: 网上类似的标题很多,有一些呼吸灯的设计是基于单片机的,还有一部分设计是基于FPGA的,我也一时手痒,将这两天自己重新写的verilog描述语句晒出来,免得压箱底放久了,出现发霉点. 为 ...

  5. 基于红外技术的交通灯设计

    目录 基于红外技术的交通灯设计 1 摘 要 1 Abstract 2 1 引言 1 1.1基于红外技术的交通灯的选题背景 1 1.2基于红外技术的交通灯选题的现实意义 1 1.3国内外研究现状及其发展 ...

  6. ewb交通灯报告和文件_基于EWB的交通灯设计

    本文着眼于目前普遍应用在城市道路上的交通灯控制系统,从课程设计的题目要求出发,设计了一个十字路口主次街道的交通灯控制电路. 首先进行交通灯状态变换的分析和交通灯总体框架的设计,接着提出了2种电路设计方 ...

  7. 基于单片机的交通灯设计

    摘要 本系统由单片机系统.键盘.LED 显示.交通灯演示系统组成.系统包括人行道.左转.右转.以及基本的交通灯的功能.系统除基本交通灯功能外,还具有倒计时.时间设置.紧急情况处理.分时段调整信号灯的点 ...

  8. 基于fpga的交通灯的设计

    课题一:交通灯控制设计 1.课程设计的目的与要求 1.1目的 以FPGA为核心,设计一个交通灯控制器,每个路口都有红.黄.绿三盏灯.该交通信号灯控制器由一条车道A和一条车道B汇合成十字路口,在每个入口 ...

  9. 基于FPGA的交通信号灯设计

    1.1 设计目的 1.2 设计任务 1.模拟十字路口交通信号灯的工作过程,利用交通信号灯上的两组红,黄,绿LED发光二极管作为交通信号灯,设计一个交通信号灯控制器. 2.模拟两条公路,一条交通主干道, ...

  10. 基于FPGA的交通灯

    交通灯是单片机和FPGA都会做的简单项目.本次交通灯做得比较简单,只是模仿一个十字路口的交通灯. 总共有三个模块组成,RTL视图如下: 顶层模块,控制模块,数码管显示模块.代码如下: 顶层模块: mo ...

最新文章

  1. mongoDB 入门指南、示例
  2. SKU表管理之查询获取sku表列表数据
  3. SQLServer表内自关联级联删除
  4. 嵌入式编程-C语言使用小技巧
  5. BZOJ 4278 [ONTAK2015]Tasowanie (后缀数组)
  6. 关于Nand ECC 错误
  7. mysql工具记录用户的查询语句_MySQL数据库的常用命令语句记录——安全用户语句及函数...
  8. Jenkins定时构建和轮询SCM设置说明
  9. RAID磁盘阵列管理
  10. codeforces920 C. Swap Adjacent Elements【连通块 + 前缀和】
  11. AirServer7电脑桌面版一款便捷式手机电脑投屏软件
  12. 【万人独木桥】那个夏天—后高考生活该如何安排?
  13. 【1 - 决策树 - 原理部分】菜菜sklearn机器学习
  14. 团队协作与团队内部竞争_为什么您的团队可能在协作游戏中失败
  15. PS替换图片中的颜色-局部以及整体变色
  16. charles证书过期如何处理
  17. “标准先行、数据支撑、平台保障、应用共享”,中地数码助力广东“数字政府”建设
  18. 巧用Excel 的vlookup()核验对比数据
  19. 北京公共计算机考试准考证打印
  20. 什么是质量?你真的了解吗?

热门文章

  1. 外卖返利系统公众号外卖cps返利小程序淘宝客程序淘客侠客外卖CPS
  2. IT项目管理流程总结·二十三
  3. html 系统评分样式,前端开发-星级评分系统
  4. 接口性能测试+调优+性能指标
  5. 这家估值83亿美元的公司,是「侠盗」还是「割韭菜」?
  6. 【数据挖掘】数据挖掘总结 ( K-Means 聚类算法 | 一维数据的 K-Means 聚类 ) ★
  7. 如何在CentOS 7上安装Yarn
  8. Excel用公式计算年龄
  9. 索尼播放器Android系统,获得最新固件的索尼NW-ZX505,简直脱胎换骨!
  10. 从哥尼斯堡“七桥问题”到盖洛普“优势识别器”