VHDL交通灯

转载请注明出处。

很讨厌码迷这种爬虫网站爬取整篇程序,所以还是加些字会好一点;

做的期末EDA实训关于交通灯;题目要求的是要做一个东西南北向的交通灯;有数码管倒计时,LED定时换颜色;复位和交通管制等功能;

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY JTD IS
    PORT (CLK1KHZ  : IN  STD_LOGIC;  --1KHZ输入
            KEY      : IN  STD_LOGIC;  --1KHZ输入
          Y1,G1,R1 : OUT STD_LOGIC;  --东西向灯
            R2,Y2,G2 : OUT STD_LOGIC;  --南北向灯
            MOTOR    : OUT STD_LOGIC;  --MOTOR
            PWM      : OUT STD_LOGIC;  --MOTOR
            WOK,RESET: IN  STD_LOGIC;  --复位和管制
            SEG      : OUT STD_LOGIC_VECTOR (6 DOWNTO 0) := "0000000";--段选
            CSG      : OUT STD_LOGIC_VECTOR (2 DOWNTO 0) := "111";    --位选
         RRCK,RSI,RSCK,GRCK,GSI,GSCK : OUT STD_LOGIC;  --红绿控制位
            RCK1,SI1,SCK1,RCK2,SI2,SCK2 : OUT STD_LOGIC;  --12io位
            RCK3,SI3,SCK3,RCK4,SI4,SCK4 : OUT STD_LOGIC;  --34io位
            Q    : OUT STD_LOGIC_VECTOR (15 DOWNTO 0));    --流水灯
    END;

以上声明库,实体等,我加了一些其他东西,流水灯;16x16红绿点阵,直流电机等,为了实训能多加点分而已,都有注释,可以选择性的用自己的一些端口和功能;

ARCHITECTURE DECL OF JTD IS
    SIGNAL CLK1HZ  : STD_LOGIC:= ‘0‘;           --分频1HZ
    SIGNAL CLK10HZ : STD_LOGIC:= ‘0‘;           --分频HZ
    SIGNAL CLK100HZ : STD_LOGIC:= ‘0‘;           --分频HZ
    SIGNAL STATUS  : INTEGER RANGE 1 TO 19 := 1;--数码管计时秒
    SIGNAL STAWE   : INTEGER RANGE 0 TO 35 := 0;--交通灯一轮计时36秒
    SIGNAL STATUS1 : STD_LOGIC_VECTOR(1 DOWNTO 0) := "00";
   SIGNAL EW      : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00011000";
    SIGNAL NS      : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00010101";
    

以上声明结构体,用到了中间信号和一些变量,有注释,选择性修改;

  PROCESS(CLK1KHZ)
        VARIABLE COUNT : INTEGER RANGE 0 TO 1000 := 1;
        VARIABLE COUNT1: INTEGER RANGE 0 TO 100  := 1;
        VARIABLE COUNT2: INTEGER RANGE 0 TO 10   := 1;
        BEGIN
            IF(RISING_EDGE(CLK1KHZ)) THEN
                IF (COUNT >= 1000) THEN COUNT  := 1; CLK1HZ  <= NOT CLK1HZ; --分频1hz
                ELSE COUNT := COUNT + 1;
                END IF;
                IF (COUNT1 >= 100) THEN COUNT1 := 1; CLK10HZ <= NOT CLK10HZ;--分频10HZ
                ELSE COUNT1 := COUNT1 + 1;
                END IF;
                IF (COUNT2 >= 10) THEN COUNT2 := 1; CLK100HZ <= NOT CLK100HZ;--分频100HZ
                ELSE COUNT2 := COUNT2 + 1;
                END IF;
            END IF;
    END PROCESS;

以上process将1khz分频为1,10,100hz;

------36秒轮回一次交通灯计时
   PROCESS(CLK1HZ,WOK,STAWE,RESET)
        BEGIN
        IF (WOK = ‘0‘) THEN               --按下工作键
        IF(RISING_EDGE(CLK1HZ)) THEN    --一次1hz时钟上升沿
                STAWE <= STAWE + 1;
                END IF;
                IF STAWE = 36 THEN STAWE <= 0; END IF;
        END IF;
       IF (RESET = ‘0‘) THEN STAWE <= 1; END IF;    --按下复位键那么时间归零,黄灯亮起
    END PROCESS;

以上process将做一次交通灯轮回计时,包含了工作键和复位键

  PROCESS(CLK10HZ,WOK)
        VARIABLE QS : STD_LOGIC_VECTOR (15 DOWNTO 0);
    BEGIN
      IF RISING_EDGE (CLK10HZ) THEN
            IF QS = 0 THEN QS := "1000000000000000";
            ELSIF QS  = "1111111111111111" THEN
                  QS := "0000000000000000";
            ELSE  QS (14 DOWNTO 0) := QS (15 DOWNTO 1); --移位操作
           END IF;
      END IF;
    Q<=QS;
   END PROCESS;

以上process为流水灯,0.1秒闪一个,用到的是移位思想;

    -----STATUS状态计时
   PROCESS(CLK1HZ,WOK,RESET)
    BEGIN
       IF (WOK = ‘0‘) THEN
           IF (RESET = ‘0‘) THEN STATUS <= 1;
            ELSIF(RISING_EDGE(CLK1HZ)) THEN
                CASE STATUS IS
                    WHEN 1  => EW <= "00011000"; NS <= "00010101";  STATUS <= STATUS + 1;
                    WHEN 2  => EW <= "00010111"; NS <= "00010100";  STATUS <= STATUS + 1;
                    WHEN 3  => EW <= "00010110"; NS <= "00010011";  STATUS <= STATUS + 1;
                    WHEN 4  => EW <= "00010101"; NS <= "00010010";  STATUS <= STATUS + 1;
                    WHEN 5  => EW <= "00010100"; NS <= "00010001";  STATUS <= STATUS + 1;
                    WHEN 6  => EW <= "00010011"; NS <= "00010000";  STATUS <= STATUS + 1;
                    WHEN 7  => EW <= "00010010"; NS <= "00001001";  STATUS <= STATUS + 1;
                    WHEN 8  => EW <= "00010001"; NS <= "00001000";  STATUS <= STATUS + 1;
                    WHEN 9  => EW <= "00010000"; NS <= "00000111";  STATUS <= STATUS + 1;
                    WHEN 10 => EW <= "00001001"; NS <= "00000110";  STATUS <= STATUS + 1;
                    WHEN 11 => EW <= "00001000"; NS <= "00000101";  STATUS <= STATUS + 1;
                    WHEN 12 => EW <= "00000111"; NS <= "00000100";  STATUS <= STATUS + 1;
                    WHEN 13 => EW <= "00000110"; NS <= "00000011";  STATUS <= STATUS + 1;
                    WHEN 14 => EW <= "00000101"; NS <= "00000010";  STATUS <= STATUS + 1;
                    WHEN 15 => EW <= "00000100"; NS <= "00000001";  STATUS <= STATUS + 1;
                    WHEN 16 => EW <= "00000011"; NS <= "00010101";  STATUS <= STATUS + 1;
                    WHEN 17 => EW <= "00000010"; NS <= "00011000";  STATUS <= STATUS + 1;
                    WHEN 18 => EW <= "00000001"; NS <= "00010111";  STATUS <= STATUS + 1;
                    WHEN OTHERS => STATUS <= 1;
                END CASE;
            END IF;
      ELSE STATUS  <= 1;
       END IF;
   END PROCESS;

    -------数码管
    PROCESS(EW,NS,CLK1KHZ)
        VARIABLE Q1 : STD_LOGIC_VECTOR(3 DOWNTO 0);
        BEGIN
        IF(RISING_EDGE(CLK1KHZ)) THEN
            CASE STATUS1 IS
                WHEN "00" => Q1 := EW(7 DOWNTO 4); CSG <= "110"; STATUS1 <= STATUS1 + 1;WHEN "01" => Q1 := EW(3 DOWNTO 0); CSG <= "111"; STATUS1 <= STATUS1 + 1;
                WHEN "10" => Q1 := NS(7 DOWNTO 4); CSG <= "000"; STATUS1 <= STATUS1 + 1;WHEN "11" => Q1 := NS(3 DOWNTO 0); CSG <= "001"; STATUS1 <= "00";
                WHEN OTHERS => Q1 := EW(7 DOWNTO 4); CSG <= "110"; STATUS1 <= "00";
            END CASE;
            CASE Q1 IS
                WHEN "0000" => SEG <= "0111111"; WHEN "0001" => SEG <= "0000110"; WHEN "0010" => SEG <= "1011011"; WHEN "0011" => SEG <= "1001111"; --3
                WHEN "0100" => SEG <= "1100110"; WHEN "0101" => SEG <= "1101101"; WHEN "0110" => SEG <= "1111101"; WHEN "0111" => SEG <= "0000111"; --7
                WHEN "1000" => SEG <= "1111111"; WHEN "1001" => SEG <= "1101111"; WHEN OTHERS => SEG <= "0000000";
            END CASE;
        END IF;
    END PROCESS;

以上两个process为数码管status和位选段选等,包含了复位等操作;

PROCESS(CLK1HZ,STAWE,WOK)
    BEGIN
        IF (WOK = ‘0‘) THEN--工作键工作
            IF RISING_EDGE(CLK1HZ) THEN
                IF (STAWE < 36 ) AND (STAWE >= 18) THEN Y1 <= ‘0‘; R1 <= ‘0‘;G1 <= ‘1‘;--35-18秒绿灯
                ELSIF (STAWE < 18) AND (STAWE >=4) THEN Y1 <= ‘0‘; R1 <= ‘1‘;G1 <= ‘0‘;--4 -17秒红灯
                ELSE  Y1 <= ‘1‘; R1 <= ‘0‘;G1 <= ‘0‘;                                  --0 - 3秒黄灯
                END IF;
                --南北向灯差4秒
                IF (STAWE < 32 ) AND (STAWE >= 14)  THEN Y2 <= ‘0‘; R2 <= ‘0‘;G2 <= ‘1‘;--31-14秒绿灯
                ELSIF (STAWE < 14) AND (STAWE >= 0) THEN Y2 <= ‘0‘; R2 <= ‘1‘;G2 <= ‘0‘;--0 -13秒红灯
                ELSE  Y2 <= ‘1‘; R2 <= ‘0‘;G2 <= ‘0‘;                                   --32-35秒黄灯
                END IF;
            END IF;
        ELSE Y2 <= ‘0‘; R2 <= ‘1‘;G2 <= ‘0‘;Y1 <= ‘0‘; R1 <= ‘1‘;G1 <= ‘0‘;--交通管制红灯全亮
        END IF;
   END PROCESS;    

以上process为交通灯情况;结合36秒计时那个进程理解;

    PROCESS(WOK)
    BEGIN
        IF (WOK= ‘1‘) THEN--工作键工作
         MOTOR<=‘1‘;PWM<=‘1‘;
         ELSE  MOTOR<=‘0‘; PWM<=‘0‘;                                --32-35秒黄灯
         END IF;
   END PROCESS;

以上process为直流电机;交通管制下电机转动;

代码都有注释,理解上修改。端口等在Pin plan自己修改;祝好运,科科

转载请注明出处。

时间: 2024-10-18 01:30:54

VHDL交通灯的相关文章

黑马程序员--交通灯管理

模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 异步随机生成按照各个路线行驶的车辆. 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由东向而来去往南向的车辆 ---- 左转车辆 ... 信号灯忽略黄灯,只考虑红灯和绿灯. 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制. 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑. 注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆

Java高级——交通灯管理系统

本方法模拟了现实生活中的交通信号灯的情况 1.先构建Road类,此类可以创建12个方向的路 代码如下: 1 package com.springtie.traffic; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.Random; 6 import java.util.concurrent.ExecutorService; 7 import java.util.concurrent.Exec

黑马程序员——【Java高新技术】——案例:交通灯管理系统

一.交通灯管理系统的项目需求 Ø 异步随机生成按照各个路线行驶的车辆 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由东向而来去往南向的车辆 ---- 左转车辆 …… Ø 信号灯忽略黄灯,只考虑红灯和绿灯. Ø 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制. Ø 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑. 注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆,而后放行左转车辆. Ø 每

黑马程序员_交通灯管理系统

(1)项目的需求 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 例如: 由南向而来去往北向的车辆 右转车辆 由东向而来去往南向的车辆 ---- 左转车辆 平时开车过十字路口红绿灯的时候,也知道红绿灯运行的顺序 (1)任何方向的车,向右边转弯的时候,是不需要看红绿灯 (2)在十字路口,相对方向的红绿灯的工作方式是一样的,南相对与北,东相对与西,这把它分成两对 (3)红绿灯顺序,一对直行通道绿灯直行车辆,等直行变红,还是这对的车辆可以左转,等左转变红,就轮到下一对了.所以在设计程序的时候,只

用QuartusII实现半加器、全加器、2-4译码器、BCD码加法器、计数器、交通灯

6.交通灯实现代码 module light(clk,set,chan,light,out); input clk,set,chan; output reg[1:0] light; output reg[3:0] out; [email protected](posedge clk or posedge chan or posedge set) if(set==1) begin out=0; light=01; end else if(chan==1) begin if(light<2) lig

多线程实战(一) : 交通灯管理系统

一. 项目要求: 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 1. 异步随机生成按照各个路线行驶的车辆. 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由东向而来去往南向的车辆 ---- 左转车辆 ... 2. 信号灯忽略黄灯,只考虑红灯和绿灯. 3. 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制. 4. 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑. 注:南北向车辆与东西向车辆交替放行,同方

奶爸业余单片机学习之:用数码管及LED实现交通灯(初版)

/* * 人行道交通灯程序:LED2(红灯).LED3(黄灯).LED4(绿灯)* 红灯30秒,绿灯3秒,绿灯15秒,倒计时 灯亮时间显示在数码管上* 晶振11.0592MHz,LED.数码管由三八译码器控制,T0中断 *程序思路:由于三八译码器每次只能输出一个低电平,因此必须用动态扫描方式点亮数码管及LED,中断间隔1ms *亮灯时间倒数,红灯60秒,绿灯20秒,黄灯3秒,顺序:红 - 绿 -黄 -红循环,因此每经历1000次中断,实现数字递减. */ #include<reg52.h>un

用Vivado写的verilog交通灯课程作业(一)

一.主模块 交通灯和七段计数 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2016/05/24 14:55:05 // Design Name: // Module Name: traffic // Project Name: // Target

黑马程序员-交通灯系统

要求: 异步随机生成按照各个路线行驶的车辆. 例如: 由南向而来去往北向的车辆 ---- 直行车辆 由西向而来去往南向的车辆 ---- 右转车辆 由东向而来去往南向的车辆 ---- 左转车辆 信号灯忽略黄灯,只考虑红灯和绿灯. 应考虑左转车辆控制信号灯,右转车辆不受信号灯控制. 具体信号灯控制逻辑与现实生活中普通交通灯控制逻辑相同,不考虑特殊情况下的控制逻辑. 注:南北向车辆与东西向车辆交替放行,同方向等待车辆应先放行直行车辆而后放行左转车辆. ?每辆车通过路口时间为1秒(提示:可通过线程Sle