找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6759|回复: 5
打印 上一主题 下一主题
收起左侧

Quartus II Verilog HDL语言Max10OC简易交通灯设计 初学者的小脚丫

[复制链接]
跳转到指定楼层
楼主

之前数电设计时做的简易状态灯,实现简单,缺点:由于双闪黄灯没有加状态,所以在切换状态时下一个状态不固定。

在十字路口的两个方向上格设一组红灯、绿灯、黄灯。设南北为为主路、东西方向为支路。当出现大雾天时可以设置两路交通灯皆为黄灯模式。

  • 设计要求
  • 交通灯主路上绿灯持续22s,黄灯4s,红灯16s;交通灯支路上绿灯持续时间12s,黄灯4s,红灯26s。
  • 出现大雾天时,倒计时停止,各方向均为黄灯

  • 设计方案选择
    • 方案选择

本设计利用Verilog HDL 语言,对一个十字路口的 交通信号灯进行控制,可控制3个路口的红、黄、绿三盏灯按特定规律进行变化

该交通控制灯分别分为为南北方向的主路和东西方向的支路。两条路的红绿灯时间是不一致的——交通灯主路上绿灯持续22s,黄灯4s,红灯16s;交通灯支路上绿灯持续时间12s,黄灯4s,红灯26s。持续期间各灯显示时间如主路绿灯自21s开始,于0s结束。采用分步模板的方式编写代码进行功能实现。以下为状态转移图:








    • 方案优缺点

采用Verilog HDL语言进行设计属于顶层设计,不需要耗费大量时间去完成底层设计工作,使用代码完成功能描述会自动分配最优搭器件搭配方式。

由于仅使用一块小脚丫,所以仅选择主路显示时间倒计时,支路采用亮灯模式不具体化时间。

因为是硬件进行操作,所以会存在延迟现象,经测试,切换转态时会延迟1s。

  • 软件设计及器件选择

4.1软件选择

软件方面采用Quartus II对Verilog HDL 语言进行实现

首先进行分频处理,因为小脚丫的处理频率是12MHZ,分频使达到我们需要1HZ的频率。


reg clk_1Hz;
reg [23:0] cnt;              //产生 1Hz 信号
always @(posedge clk_in or negedge rst_n_in)
    begin
        if(!rst_n_in) begin
            cnt <= 0;
            clk_1Hz <= 0;
        end else if(cnt == 24'd5_999_999) begin   
            cnt<=0;
            clk_1Hz <= ~clk_1Hz;        
        end else cnt<=cnt+1'b1;     
    end
其次进行三段式分态:
1.同步时序状态转移
reg [7:0] timecnt;
reg [1:0] c_state,n_state;            
reg    flag;                                                         //启动暂停标志            
//同步状态转移
always @(posedge clk_1Hz or negedge rst_n_in)
    if(!rst_n_in)
        c_state <= S1;
    else
        c_state <= n_state;

2.组合逻辑状态转移
//判断转移条件
always @(c_state or timecnt)
    if(!rst_n_in)begin
        n_state = S1;
    end else begin
        case(c_state)
            S1: if(!timecnt) n_state = S2; else n_state = S1;
            S2: if(!timecnt) n_state = S3; else n_state = S2;
            S3: if(!timecnt) n_state = S4; else n_state = S3;
            S4: if(!timecnt) n_state = S1; else n_state = S4;
            default:n_state = S1;
        endcase
    end

//产生标志信号(雾天黄灯)
always @(posedge clk_1Hz or negedge rst_n_in)
              begin
if(!rst_n_in)
        flag = 1'b1;
else if(!key)
     begin
        flag = ~flag;
        end
    else
    begin
        flag = flag;
        end
end
3.同步逻辑输出
//同步逻辑输出
always @(posedge clk_1Hz or negedge rst_n_in) begin
                            if(!rst_n_in)begin
        timecnt <= 8'h21;              //初始值
        led_master <= GREEN;
        led_slave <= RED;
                              end
                            else if(flag)
                            begin
      case(n_state)
            S1: begin
                led_master <= GREEN;
                led_slave <= RED;
                if(timecnt==0) begin
                    timecnt <= 8'h21;
                end else begin
                    if(timecnt[3:0]==0) begin              //个位为0十位减一
                        timecnt[7:4] <= timecnt[7:4] - 1'b1;
                        timecnt[3:0] <= 4'd9;
                    end else timecnt[3:0] <= timecnt[3:0] - 1'b1;              //个位减一,为0时切换状态
                end
            end
            S2: begin
                led_master <= YELLOW;
                led_slave <= RED;
                if(timecnt==0) begin
                    timecnt <= 8'h03;              //S2时的初态值
                end else begin
                    if(timecnt[3:0]==0) begin
                        timecnt[7:4] <= timecnt[7:4] - 1'b1;
                        timecnt[3:0] <= 4'd9;
                    end else timecnt[3:0] <= timecnt[3:0] - 1'b1;
                end
            end
            S3: begin
                led_master <= RED;
                led_slave <= GREEN;
                if(timecnt==0) begin
                    timecnt <= 8'h15;
                end else begin
                    if(timecnt[3:0]==0) begin
                        timecnt[7:4] <= timecnt[7:4] - 1'b1;
                        timecnt[3:0] <= 4'd9;
                    end else timecnt[3:0] <= timecnt[3:0] - 1'b1;
                end
            end
            S4: begin
                led_master <= RED;
                led_slave <= YELLOW;
                if(timecnt==0) begin
                    timecnt <= 8'h03;
                end else begin
                    if(timecnt[3:0]==0) begin
                        timecnt[7:4] <= timecnt[7:4] - 1'b1;
                        timecnt[3:0] <= 4'd9;
                    end else timecnt[3:0] <= timecnt[3:0] - 1'b1;
                end
            end
            default:;
        endcase
                              end
                 else begin
                              timecnt<=0;
                              led_master <= YELLOW;
        led_slave <= YELLOW;
                 end
end
最后使用segment模块进行对数码管的操作
//segment模块进行对数码管的操作,体现了模块思想。

module Segment_led
(
input  [3:0] seg_data_1,  //四位输入数据信号
input  [3:0] seg_data_2,  //四位输入数据信号
output [8:0] segment_led_1,  //数码管1,MSB~LSB = SEG,DP,G,F,E,D,C,B,A
output [8:0] segment_led_2   //数码管2,MSB~LSB = SEG,DP,G,F,E,D,C,B,A
);

reg[8:0] seg [9:0];
initial
    begin
        seg[0] = 9'h3f;   //  0
        seg[1] = 9'h06;   //  1
        seg[2] = 9'h5b;   //  2
        seg[3] = 9'h4f;   //  3
        seg[4] = 9'h66;   //  4
        seg[5] = 9'h6d;   //  5
        seg[6] = 9'h7d;   //  6
        seg[7] = 9'h07;   //  7
        seg[8] = 9'h7f;   //  8
        seg[9] = 9'h6f;   //  9
    end

assign segment_led_1 = seg[seg_data_1];
assign segment_led_2 = seg[seg_data_2];

endmodule

4.2 硬件选择

硬件方面采用小脚丫STEP FPGA MAX 10开发板,具体参数为:

· 核心器件 Altera MAX10 10M02S153I7G
· 1 路MicroUSB接口
· 2 位7段数码管
· 2 个RGB三色LED
· 4 路拨码开关
· 4 路按键
· 8 路用户LED
· 36 个用户可扩展I/O

结论
5.1 问题分析

将代码综合下载到版上,有如下四种状态和双黄灯倒计时停止打的特殊状态

状态1 主绿灯  从红灯 倒计时

状态2 主黄灯 从红灯

状态3 主红灯 从绿灯

状态4 主红灯 从黄灯

特殊状态:双黄灯闪烁 数码管显示00 停止倒计时

综上小脚丫展示的四个状态与预设逻辑状态相符,运行过程中也确实存在1s延迟情况。当使用暂停按钮达到双黄灯模式时缺乏下一个状态,无法自动转移转态。所以我们采用复位措施使其重新循环。

5.2心得体会

通过这次设计,加强我们动手、思考和解决问题的能力。在准备期间,我们小组在B站上进行视频学习和上网查阅资料进行软硬件了解数字电子技术是一门实践性很强的,而数电设计是实践环节的重要组成部分,它给我们提供了一个理论联系实际、检验知识、加深认识、开拓思维、汲取新知识的机会。数电的内容虽然只是一个简单的数字系统,但在思考问题、提出问题、解决疑难、排除障碍的过程中,却能达到升华所学知识、训练综合、创新能力及团队合作能力之目的。在完成的过程中,可以学到QUARTUSII软件的使用方法,并且掌握状态机的设计方法及利用数字电路实现自动控制的思路和方法。




全部资料51hei下载地址:
简易交通信号灯.zip (3.23 MB, 下载次数: 55)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:430492 发表于 2020-10-30 15:12 | 只看该作者
板子是网上买的吗?还是自己做的?
回复

使用道具 举报

板凳
ID:828188 发表于 2020-10-30 20:11 | 只看该作者
cooleaf 发表于 2020-10-30 15:12
板子是网上买的吗?还是自己做的?

网上买的小脚丫开发板,师傅推荐的
回复

使用道具 举报

地板
ID:945161 发表于 2021-6-26 16:28 | 只看该作者
应该怎么把它们整在一起 我弄出来有很多错误
回复

使用道具 举报

5#
ID:828188 发表于 2021-12-11 18:06 | 只看该作者
新我 发表于 2021-6-26 16:28
应该怎么把它们整在一起 我弄出来有很多错误

你的仿真信号编写了吗?有问题的话联系我
回复

使用道具 举报

6#
ID:991119 发表于 2021-12-12 08:29 来自手机 | 只看该作者
这里面有管脚分配吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表