找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3045|回复: 1
收起左侧

基于FPGA的交通灯vhdl程序设计

[复制链接]
ID:540107 发表于 2019-12-29 11:15 | 显示全部楼层 |阅读模式
51hei.png

单片机源程序如下:
  1.   -------------------------------------
  2.    --  Title:交通灯控制器             --
  3.    --  Data: 2019-12-11               --
  4.    -------------------------------------
  5. library ieee;
  6. use ieee.std_logic_1164.all;
  7. use ieee.std_logic_arith.all;
  8. use ieee.std_logic_unsigned.all;
  9. --------------------------------------------------------------------
  10. entity traffic_light is
  11.   port( Clk       :  in   std_logic;   --时钟输入    为50MHz
  12.         Rst       :  in   std_logic;   --复位输入
  13.         R1,R2     :  out  std_logic;   --红灯输出
  14.         Y1,Y2     :  out  std_logic;   --黄灯输出
  15.         G1,G2     :  out  std_logic;   --绿灯输出
  16.         Display   :  out  std_logic_vector(6 downto 0);  --七段码管显示输出
  17.         SEG_SEL   :  buffer  std_logic_vector(3 downto 0) --七段码管扫描驱动(四位数码管)
  18.        );      
  19. end traffic_light ;
  20. --------------------------------------------------------------------
  21. architecture behave of traffic_light is
  22.   signal Disp_Temp     : integer range 0 to 15;
  23.   signal Disp_Decode   : std_logic_vector(6 downto 0);   --段选缓存
  24.   signal SEC1,SEC10    : integer range 0 to 9;
  25.   signal Direction     : integer range 0 to 15;

  26.   signal Clk_Count1    : std_logic_vector(9 downto 0);   --产生0.5Hz时钟的分频计数器
  27.   signal Clk1Hz        : std_logic;
  28.   signal Dir_Flag      : std_logic;    --方向标志
  29.   signal C             : integer range 0 to 50000:=0;    --50MHz转1kHz
  30.   signal L             : integer range 0 to 50000:=0;    --50MHz转1kHz
  31.   signal Wei_Flag      : std_logic_vector(1 downto 0);           --当前扫描数码管位数
  32.   signal Wei           : std_logic_vector(3 downto 0);   --位选缓存

  33.    
  34.   begin
  35.     process(Clk)
  36.       begin
  37.         if(Clk'event and Clk='1') then
  38.            C<=C+1;
  39.            if(C>=50000) then                                  --50MHz转1kHz
  40.              C<=0;
  41.              if(Clk_Count1<1000) then
  42.                Clk_Count1<=Clk_Count1+"01";   
  43.              else
  44.                Clk_Count1<="0000000001";
  45.              end if;
  46.            end if;
  47.         end if;
  48.     end process;
  49.     Clk1Hz<=Clk_Count1(9);
  50.     process(Clk1Hz,Rst)
  51.       begin
  52.         if(Rst='0') then
  53.            SEC1<=0;
  54.            SEC10<=2;
  55.            Dir_Flag<='0';
  56.         elsif(Clk1Hz'event and Clk1Hz='1') then
  57.            if(SEC1=0) then
  58.               SEC1<=9;
  59.               if(SEC10=0) then
  60.                  SEC10<=1;
  61.                else
  62.                  SEC10<=SEC10-1;
  63.                end if;
  64.            else
  65.               SEC1<=SEC1-1;
  66.            end if;
  67.            if(SEC1=0 and SEC10=0) then
  68.               Dir_Flag<=not Dir_Flag;
  69.            end if;
  70.         end if;
  71.     end process;

  72.     process(Clk1Hz,Rst)
  73.       begin
  74.         if(Rst='0') then
  75.            R1<='1';
  76.            G1<='0';
  77.            R2<='1';
  78.            G2<='0';
  79.         else                             --正常运行
  80.            if(SEC10>0 or SEC1>3) then
  81.               if(Dir_Flag='0') then      --横向通行
  82.                  R1<='0';
  83.                  G1<='1';
  84.                  R2<='1';
  85.                  G2<='0';            
  86.               else
  87.                  R1<='1';
  88.                  G1<='0';
  89.                  R2<='0';
  90.                  G2<='1';            
  91.               end if;
  92.            else
  93.               if(Dir_Flag='0') then      --横向通行
  94.                  R1<='0';
  95.                  G1<='0';
  96.                  R2<='1';
  97.                  G2<='0';            
  98.               else
  99.                  R1<='1';
  100.                  G1<='0';
  101.                  R2<='0';
  102.                  G2<='0';   
  103.               end if;                 
  104.            end if;
  105.         end if;
  106.     end process;

  107.     process(Clk1Hz)
  108.       begin
  109.         if(SEC10>0 or SEC1>3) then
  110.            Y1<='0';
  111.            Y2<='0';
  112.         elsif(Dir_Flag='0') then
  113.            Y1<=Clk1Hz;
  114.            Y2<='0';
  115.         else
  116.            Y1<='0';
  117.            Y2<=Clk1Hz;
  118.         end if;      
  119.     end process;

  120.     process(Dir_Flag)
  121.       begin
  122.         if(Dir_Flag='0') then   --横向
  123.            Direction<=10;
  124.         else                    --纵向
  125.            Direction<=11;
  126.         end if;
  127.     end process;

  128.     process(Wei_Flag)      
  129.       begin
  130.         case (Wei_Flag+"01") is
  131.           when "00"=>
  132.                Wei<="1110";
  133.                Disp_Temp<=Direction;
  134.           when "01"=>
  135.                     Wei<="1101";
  136.                Disp_Temp<=Direction;
  137.           when "10"=>
  138.                Wei<="1011";
  139.                Disp_Temp<=SEC10;
  140.           when "11"=>
  141.                Wei<="0111";
  142.                Disp_Temp<=SEC1;
  143.        end case;   
  144.     end process;

  145.     process(Clk)
  146.       begin
  147.         if(Clk'event and Clk='1') then    --扫描累加
  148.            L<=L+1;                             --50MHz转1kHz
  149.            if(L>=50000) then
  150.              L<=0;
  151.              SEG_SEL<=Wei;
  152.              Wei_Flag<=Wei_Flag+1;        --准备下一数码管
  153.              Display<=Disp_Decode;
  154.            end if;
  155.         end if;
  156.     end process;
  157.     process(Disp_Temp)      --显示转换
  158.       begin
  159.         case Disp_Temp is
  160.           when 0=>Disp_Decode<="0111111";   --'0'
  161.           when 1=>Disp_Decode<="0000110";   --'1'
  162.           when 2=>Disp_Decode<="1011011";   --'2'
  163.           when 3=>Disp_Decode<="1001111";   --'3'
  164.           when 4=>Disp_Decode<="1100110";   --'4'
  165.           when 5=>Disp_Decode<="1101101";   --'5'
  166.           when 6=>Disp_Decode<="1111101";   --'6'
  167.           when 7=>Disp_Decode<="0000111";   --'7'
  168.           when 8=>Disp_Decode<="1111111";   --'8'
  169.           when 9=>Disp_Decode<="1101111";   --'9'
  170.           when 10=>Disp_Decode<="1001000";   --'='
  171.           when 11=>Disp_Decode<="0110110";   --'||'
  172.           when others=>Disp_Decode<="0000000";   --全灭
  173.         end case;
  174.     end process;   

  175. end behave;
复制代码

所有资料51hei提供下载:
交通灯.pdf (137.48 KB, 下载次数: 36)
回复

使用道具 举报

ID:704585 发表于 2020-4-8 14:23 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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