查看: 4852|回复: 9

[提问] 用VHDL语言编写程序

[复制链接]
发表于 2012-11-28 13:07:13 | 显示全部楼层 |阅读模式
交通灯控制器
系统设计要求:
在十字路口,东西南北各有一组红、黄、绿灯,其控制功能:

1)复位状态东西南北黄灯亮。

(2)东西两侧红灯亮,南北两侧绿灯亮
  (3)东西两侧红灯亮,南北两侧黄灯亮(准备变红灯)。


4)东西两侧绿灯亮,南北两侧红灯亮。

5)东西两侧黄灯亮(准备变红灯),南北两侧红灯亮。
发表于 2012-11-29 16:39:04 | 显示全部楼层
这个我还真的是不懂的
发表于 2012-11-30 10:02:14 | 显示全部楼层
这是一个状态机问题,4状态输入,12状态输出。
发表于 2012-11-30 10:28:21 | 显示全部楼层
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.numeric_std.all;

entity CrossLED is
   Port (
      nRST:    in    std_logic;                    -- 系统复位控制信号,低电平有效。
--
--                各信号下标3、2、1、0对应方向东、南、西、北。
--                输出0,对应信号灯亮;输出1,对应信号灯灭。
--
                State:        in                std_logic_vector(1 downto 0);        --
                Yellow:        out        std_logic_vector(3 downto 0);
                Red:                out        std_logic_vector(3 downto 0);
                Blue:                out        std_logic_vector(3 downto 0)
   );
end CrossLED;

architecture Behavioral of CrossLED is
begin
        Yellow        <= "0000"                when nRST  = '0'  else        -- 复位状态东西南北黄灯亮。
                                   "1111"                when State = "00" else        -- 东西两侧红灯亮,南北两侧绿灯亮。
                                   "1010"                when State = "01" else        -- 东西两侧红灯亮,南北两侧黄灯亮(准备变红灯)。
                                   "1111"                when State = "10" else        -- 东西两侧绿灯亮,南北两侧红灯亮。
                                   "0101"                when State = "11" else        -- 东西两侧黄灯亮(准备变红灯),南北两侧红灯亮。
                                   "0000";
        Red                <= "1111"                when nRST  = '0'  else        -- 复位状态东西南北黄灯亮。
                                   "0101"                when State = "00" else        -- 东西两侧红灯亮,南北两侧绿灯亮。
                                   "0101"                when State = "01" else        -- 东西两侧红灯亮,南北两侧黄灯亮(准备变红灯)。
                                   "1010"                when State = "10" else        -- 东西两侧绿灯亮,南北两侧红灯亮。
                                   "1010"                when State = "11" else        -- 东西两侧黄灯亮(准备变红灯),南北两侧红灯亮。
                                   "1111";
        Blue                <= "1111"                when nRST  = '0'  else        -- 复位状态东西南北黄灯亮。
                                   "1010"                when State = "00" else        -- 东西两侧红灯亮,南北两侧绿灯亮。
                                   "1111"                when State = "01" else        -- 东西两侧红灯亮,南北两侧黄灯亮(准备变红灯)。
                                   "0101"                when State = "10" else        -- 东西两侧绿灯亮,南北两侧红灯亮。
                                   "1111"                when State = "11" else        -- 东西两侧黄灯亮(准备变红灯),南北两侧红灯亮。
                                   "1111";
end Behavioral;
 楼主| 发表于 2012-12-2 14:52:07 | 显示全部楼层
谢谢大家喽!
发表于 2012-12-4 23:46:28 | 显示全部楼层
student homework?
发表于 2012-12-17 20:27:56 | 显示全部楼层
写了一个verilog版,仅供楼主参考.
module traffic_led(rst_n, clk, r1, y1, g1, r2, y2,g2);
input rst_n, clk;
output  r1, y1, g1, r2, y2,g2;
reg r1, y1, g1, r2, y2,g2;
reg [4:0] state, nextstate;

parameter  s0 = 5'b00001, s1 = 5'b00010, s2 = 5'b00100, s3 = 5'b01000, s4 = 5'b10000;

always @(posedge clk or negedge rst_n)
begin
    if(rst_n == 0)
         begin  
           state <= s0;
         end
         else
         begin
           state <= nextstate;
         end
end
always @(state)
begin
  case(state)
    s0: begin
               r1 <= 0;
                         y1 <= 1;
                         g1 <= 0;
                         r2 <= 0;
                         y2 <= 1;
                         g2 <= 0;
                         nextstate <= s1;
        end
         s1: begin
               r1 <= 1;
                         y1 <= 0;
                         g1 <= 0;
                         r2 <= 0;
                         y2 <= 0;
                         g2 <= 1;
                         nextstate <= s2;
        end
         s2: begin
               r1 <= 1;
                         y1 <= 0;
                         g1 <= 0;
                         r2 <= 0;
                         y2 <= 1;
                         g2 <= 0;
                         nextstate <= s3;
        end
         s3: begin
               r1 <= 0;
                         y1 <= 0;
                         g1 <= 1;
                         r2 <= 1;
                         y2 <= 0;
                         g2 <= 0;
                         nextstate <= s4;
        end
         s4: begin
               r1 <= 0;
                         y1 <= 1;
                         g1 <= 0;
                         r2 <= 1;
                         y2 <= 0;
                         g2 <= 0;
                         nextstate <= s1;
        end
         default: nextstate <= s0;
        endcase
     
end
endmodule
发表于 2012-12-17 20:28:18 | 显示全部楼层
这个是测试程序

`timescale  100ns/10ns
module testbrench;
reg rst_n, clk;
wire r1, y1, g1, r2, y2,g2;

traffic_led tl1(rst_n, clk, r1, y1, g1, r2, y2,g2);
initial
begin
  rst_n = 1;
  clk = 0;
end
always
begin
  #5 clk = ~clk;
end
initial
begin
#10 rst_n = 0;
#20 rst_n = 1;
end
endmodule
发表于 2012-12-27 08:31:09 | 显示全部楼层
学习了。。。。。。。。。。。。。。。。。。。。
发表于 2013-8-21 08:47:20 | 显示全部楼层
复制下来!!!!!!!!我自己好好学习!!!!!!!!!!!!!!!!!!!!
谢谢.jpg
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表