zoukankan      html  css  js  c++  java
  • 设计“十字路口交通灯管理系统”

    设计“十字路口交通灯管理系统”

    项目:一条主干道,一条乡间公路。组成十字路口,要求优先保证主干道通行。

    设计要求:

    (1)     有MR(主红)、MY(主黄)、MG(主绿)、CR(乡红)、CY(乡黄)、CG(乡绿)六盏交通灯需要控制;

    (2)     交通灯由绿→红有4秒黄灯亮的间隔时间,由红→绿没有间隔时间;

    (3)     系统有MRCY、MRCG、MYCR、MGCR四个状态;

    (4)     乡间公路右侧各埋有一个传感器,当有车辆通过乡间公路时,发出请求信号S=1,其余时间S=0;

    (5)     平时系统停留在MGCR(主干道通行)状态,一旦S信号有效,经MYCR(黄灯状态)转入MRCG(乡间公路通行)状态,但要保证MGCR的状态不得短于一分钟(一分钟以后随时待命接收S信号);

    (6)     一旦S信号无效,系统脱离MRCG状态。随即经MRCY(黄灯状态)进入MGCR状态,即使S信号一直有效,MRCG状态也不得长于20秒钟。

    分析:

    l  系统设置一个两位BCD码倒计时计数器(计数脉冲1HZ),用于记录各状态持续时间;

    l  因为各状态持续时间不一致,所以上述计数器应置入不同的预置数;

    l  倒计时计数值输出至二个数码管显示;

    l  程序共设置4个过程P1、P2、P3、P4:

    ① 过程P1、P2和P3构成两个带有预置数功能的十进制计数器,其中P1和P3分别为个位和十位计数器,P2产生个位向十位的进位信号;

    ② 过程P4是状态寄存器,控制状态的转换,并输出6盏交通灯的控制信号。

    用Rerilog语言编写程序实现“十字路口交通灯管理系统”的原理框图如下:

     

    输出SC = MR MY MG CR CY CG  初值SC=001100

    状态State:  mgcr → mycr → mrcg → mrcy

    过程P4流程图:

                       

    我的解答v1版本:

     1 //module midtest(ge_wei, shi_wei, clk, en, s);
     2 module midtest(ge_wei, shi_wei, current_state, clk, en, s);
     3     output reg [7:0] ge_wei, shi_wei;
     4 //    output [7:0] timer;
     5     output [7:0] current_state;
     6     input clk,s,en;
     7 //    parameter mgcr=6'b001100, mycr=6'b010100,
     8 //            mrcg=6'b100001, mrcy=6'b100010;
     9     parameter mgcr=6'b000000, mycr=6'b000001,
    10             mrcg=6'b000010, mrcy=6'b000011;
    11     reg [7:0] timer;
    12     reg [7:0] current_state;
    13     initial begin
    14         timer = 0;
    15         ge_wei = 0; shi_wei = 0;
    16         current_state <= mgcr;
    17     end
    18 
    19     always @(negedge clk) begin
    20         if(en) begin
    21             case(current_state)
    22             mgcr: begin
    23                 timer = timer + 1;
    24                 if(s) begin
    25                     if(timer >= 60) begin
    26                         timer = 0;
    27                         current_state <= mycr;
    28                     end
    29                 end
    30             end
    31             mycr: begin
    32                 timer = timer + 1;
    33                 if(timer >= 4) begin
    34                     timer = 0;
    35                     current_state <= mrcg;
    36                 end
    37             end
    38             mrcg: begin
    39                 timer = timer + 1;
    40                 //if(timer >= 20 || !s) begin
    41                 if(timer >= 20) begin
    42                     timer = 0;
    43                     current_state = mrcy;
    44                 end
    45             end
    46             mrcy: begin
    47                 timer = timer + 1;
    48                 if(timer >= 4) begin
    49                     timer = 0;
    50                     current_state <= mgcr;
    51                 end
    52             end
    53         endcase
    54             ge_wei = timer%10;
    55             shi_wei =timer/10;
    56         end
    57     end
    58     
    59 
    60 endmodule

    19:48:19|| v2 版本

     1 //module midtest(ge_wei, shi_wei, clk, en, s);
     2 module midtest(ge_wei, shi_wei, current_state, clk, en, s);
     3     output reg [7:0] ge_wei, shi_wei;
     4 //    output [7:0] timer;
     5     output [7:0] current_state;
     6     input clk,s,en;
     7 //    parameter mgcr=6'b001100, mycr=6'b010100,
     8 //            mrcg=6'b100001, mrcy=6'b100010;
     9     parameter mgcr=6'b000000, mycr=6'b000001,
    10             mrcg=6'b000010, mrcy=6'b000011;
    11     reg [7:0] timer;
    12     reg [7:0] current_state;
    13     initial begin
    14         timer = 0;
    15         ge_wei = 0; shi_wei = 0;
    16         current_state <= mgcr;
    17     end
    18 
    19     always @(negedge clk) begin
    20         if(en) begin
    21             case(current_state)
    22             mgcr: begin
    23                 timer = timer + 1;
    24                 if(s) begin
    25                     if(timer >= 60) begin
    26                         timer = 0;
    27                         current_state <= mycr;
    28                     end
    29                 end
    30             end
    31             mycr: begin
    32                 timer = timer + 1;
    33                 if(timer >= 4) begin
    34                     timer = 0;
    35                     current_state <= mrcg;
    36                 end
    37             end
    38             mrcg: begin
    39                 timer = timer + 1;
    40                 //if(timer >= 20 || !s) begin
    41                 if(timer >= 20) begin
    42                     timer = 0;
    43                     current_state = mrcy;
    44                 end
    45             end
    46             mrcy: begin
    47                 timer = timer + 1;
    48                 if(timer >= 4) begin
    49                     timer = 0;
    50                     current_state <= mgcr;
    51                 end
    52             end
    53         endcase
    54             ge_wei = timer%10;
    55             shi_wei =timer/10;
    56         end
    57     end
    58     
    59 
    60 endmodule

                    

  • 相关阅读:
    郁闷的Alexa破10万。
    回到杭州,2009开始了。
    美剧。
    英来网招聘:兼职js开发。(补充)
    村姑的Beta 2.0,TT。
    爆牙齿的Web标准面试考题II(iPhone SMS/iChat UI的Web标准实现)
    天使飞来。
    Web标准的未来,浏览器的未来,应用的未来。
    咖啡厅与产品形态。
    学习使用笔和纸。
  • 原文地址:https://www.cnblogs.com/fallenmoon/p/6763710.html
Copyright © 2011-2022 走看看