集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1552|回复: 1

VHDL高手请指点,谢谢

[复制链接]
苍穹的眼泪 发表于 2011-6-8 12:24:22 | 显示全部楼层 |阅读模式
本帖最后由 苍穹的眼泪 于 2011-6-8 14:32 编辑

小弟最近写了个程序,感觉没什么错误,但就是不能通过编译。期高手指点。小弟在此先谢谢啦!
程序如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY Controller IS
  PORT(
       --控制器输入信号
       Clk:IN STD_LOGIC;
                                         --时钟输入信号,由分频模块分频后接入1Hz信号
       Reset:IN STD_LOGIC;
                                         --复位信号,低电平有效,复位后交通灯全部熄灭
       En:IN STD_LOGIC_VECTOR(1 DOWNTO 0);
                                         --四种工作模式选择信号
       Timer:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
                                         --计数器数值选择端口,高低两位分别选择两个不同通行的时间
       --控制器输出信号
       Counter_a:OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
       Counter_b:OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
                                         --两个不同方向通行时间
       Wr:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
       Ws:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
       Wl:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
       Wc:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
                                         --西面交通信号灯输出
       Nr:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
       Ns:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
       Nl:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
       Nc:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
                                         --北面交通灯信号输出
       Er:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
       Es:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
       El:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
       Ec:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
                                         --东面交通信号灯输出
       Sr:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
       Ss:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
       Sl:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);
       Sc:OUT STD_LOGIC_VECTOR(1 DOWNTO 0)
                                         --南面交通信号灯输出
      );
END Controller;

ARCHITECTURE Behav OF Controller IS
  TYPE STATES IS (LOAD,NS,ES_WN,EW,WS_EN);
                                         --定义模式一与模式二的五个状态
  SIGNAL a,b:STD_LOGIC_VECTOR(1 DOWNTO 0);
                                         --用于给输入的时间编码分段
  SIGNAL count:STD_LOGIC_VECTOR(5 DOWNTO 0);
                                         --用于寄存计数器临时值
  SIGNAL count_a:STD_LOGIC_VECTOR(5 DOWNTO 0):="000000";
  SIGNAL count_b:STD_LOGIC_VECTOR(5 DOWNTO 0):="000000";
                                         --用于寄存计数器的具体值
  SIGNAL current_state1,current_state2,next_state1,next_state2: STATES;
                                         --分别用于模式一与模式二的状态寄存器
BEGIN
  --各个模式及其状态转移
REGROCESS(Reset,Clk,Timer)
    BEGIN
      IF(Reset='0') THEN
         Wr<="00";Ws<="00";Wl<="00";Wc<="00";Nr<="00";Ns<="00";Nl<="00";Nc<="00";
         Er<="00";Es<="00";El<="00";Ec<="00";Sr<="00";Ss<="00";Sl<="00";Sc<="00";
         a<=Timer(0)&Timer(1);
         b<=Timer(2)&Timer(3);
        CASE a IS
          WHEN"00"=>count_a<="001111";
          WHEN"01"=>count_a<="010100";
          WHEN"10"=>count_a<="011001";
          WHEN"11"=>count_a<="011110";
        END CASE;
        CASE b IS
          WHEN"00"=>count_b<="000101";
          WHEN"01"=>count_b<="001010";
          WHEN"10"=>count_b<="001111";
          WHEN"11"=>count_b<="010100";
       END CASE;
      current_state1<=LOAD;
      current_state2<=LOAD;
      ELSIF(Clk'EVENT AND Clk='1') THEN
          current_state1<=next_state1;
          current_state2<=next_state2;
      END IF;
    END PROCESS;
COMROCESS(current_state1,current_state2,next_state1,next_state2,en)
    BEGIN
      --进入模式一
      IF(En="00") THEN
         CASE current_state1 IS
           WHEN LOAD =>                        --模式一状态0
                    IF(count="000000") THEN
                       Wr<="10";Ws<="10";Wl<="10";Wc<="10";Nr<="10";Ns<="10";Nl<="10";Nc<="10";
                       Er<="10";Es<="10";El<="10";Ec<="10";Sr<="10";Ss<="10";Sl<="10";Sc<="10";
                    ELSIF(count="000100") THEN
                          Wr<="01";Ws<="01";Wl<="01";Wc<="01";Nr<="01";Ns<="01";Nl<="01";Nc<="01";
                          Er<="01";Es<="01";El<="01";Ec<="01";Sr<="01";Ss<="01";Sl<="01";Sc<="01";
                    ELSE(count="000111")
                         next_state1<=NS;
                         count<="000000";
                         Counter_a<=count_a;
                         Counter_b<=count_b;
                    END IF;
                    count<=count+1;
            WHEN NS =>                          --模式一状态1
                    Counter_a<=Count_a-1;
                    IF(Counter_a/="000000") THEN
                       Wr<="10";Ws<="10";Wl<="10";Wc<="01";Nr<="10";Ns<="01";Nl<="10";Nc<="10";
                       Er<="10";Es<="10";El<="10";Ec<="01";Sr<="10";Ss<="01";Sl<="10";Sc<="10";
                       next_state1<=NS;
                    ELSE next_state1<=ES_WN;Counter_a<=count_a;
                    END IF;
            WHEN ES_WN =>                       --模式一状态2
                       Counter_b<=Counter_b-1;
                       IF(Counter_b/="000000") THEN
                          Wr<="10";Ws<="10";Wl<="10";Wc<="10";Nr<="01";Ns<="10";Nl<="01";Nc<="10";
                          Er<="10";Es<="10";El<="10";Ec<="10";Sr<="01";Ss<="10";Sl<="01";Sc<="10";
                          next_state1<=ES_WN;
                       ELSE next_state1<=EW;Counter_b<=count_b;
                       END IF;
            WHEN EW =>                          --模式一状态3
                    Counter_a<=Counter_a-1;
                    IF(Counter_a/="000000") THEN
                       Wr<="10";Ws<="01";Wl<="10";Wc<="10";Nr<="10";Ns<="10";Nl<="10";Nc<="01";
                       Er<="10";Es<="01";El<="10";Ec<="10";Sr<="10";Ss<="10";Sl<="10";Sc<="01";
                       next_state1<=EW;
                    ELSE next_state1<=WS_EN;Counter_a<=count_a;
                    END IF;
            WHEN WS_EN =>                       --模式一状态4
                       Counter_b<=Counter_b-1;
                       IF(Counter_b/="000000") THEN
                          Wr<="01";Ws<="10";Wl<="10";Wc<="10";Nr<="10";Ns<="10";Nl<="10";Nc<="10";
                          Er<="01";Es<="10";El<="10";Ec<="10";Sr<="10";Ss<="10";Sl<="10";Sc<="10";
                          next_state1<=WS_EN;
                       ELSE next_state1<=NS;Counter_b<=count_b;
                       END IF;
         END CASE;
      --进入模式二
      ELSIF(En="01") THEN
            CASE current_state2 IS
              WHEN LOAD =>                      --模式二状态0
                        IF(count="000000") THEN
                           Wr<="10";Ws<="10";Wl<="10";Wc<="10";Nr<="10";Ns<="10";Nl<="10";Nc<="10";
                           Er<="10";Es<="10";El<="10";Ec<="10";Sr<="10";Ss<="10";Sl<="10";Sc<="10";
                        ELSIF(count="000100") THEN
                              Wr<="01";Ws<="01";Wl<="01";Wc<="01";Nr<="01";Ns<="01";Nl<="01";Nc<="01";
                              Er<="01";Es<="01";El<="01";Ec<="01";Sr<="01";Ss<="01";Sl<="01";Sc<="01";
                        ELSE(count="000111")
                             next_state2<=NS;
                             count<="000000";
                             Counter_a<=(count_a+count_b)/2;
                             Counter_b<=(count_a+count_b)/2;
                        END IF;
                        count<=count+1;
              WHEN NS =>                        --模式二状态1
                      Counter_a<=Counter_a-1;
                      IF(Counter_a/="000000") THEN
                         Wr<="01";Ws<="10";Wl<="10";Wc<="01";Nr<="01";Ns<="10";Nl<="10";Nc<="10";
                         Er<="10";Es<="10";El<="10";Ec<="10";Sr<="10";Ss<="01";Sl<="01";Sc<="10";
                         next_state2<=NS;
                      ELSE next_state2<=ES_WN;Counter_a<=(count_a+count_b)/2;
                      END IF;
              WHEN ES_WN =>                     --模式二状态2
                         Counter_b<=Counter_b-1;
                         IF(Counter_b/="000000") THEN
                            Wr<="10";Ws<="01";Wl<="01";Wc<="10";Nr<="01";Ns<="10";Nl<="10";Nc<="01";
                            Er<="01";Es<="10";El<="10";Ec<="10";Sr<="10";Ss<="10";Sl<="10";Sc<="10";
                            next_state2<=ES_WN;
                         ELSE next_state2<=EW;Counter_b<=(count_a+count_b)/2;
                         END IF;
              WHEN EW =>                        --模式二状态3
                      Counter_a<=Counter_a-1;
                      IF(Counter_a/="000000") THEN
                         Wr<="10";Ws<="10";Wl<="10";Wc<="10";Nr<="10";Ns<="01";Nl<="01";Nc<="10";
                         Er<="01";Es<="10";El<="01";Ec<="01";Sr<="01";Ss<="10";Sl<="10";Sc<="10";
                         next_state2<=EW;
                      ELSE next_state2<=WS_EN;Counter_a<=(count_a+count_b)/2;
                      END IF;
              WHEN WS_EN =>                     --模式二状态4
                         Counter_b<=Counter_b-1;
                         IF(Counter_b/="000000") THEN
                            Wr<="01";Ws<="10";Wl<="10";Wc<="10";Nr<="10";Ns<="10";Nl<="10";Nc<="10";
                            Er<="10";Es<="01";El<="10";Ec<="10";Sr<="01";Ss<="10";Sl<="01";Sc<="01";
                            next_state2<=WS_EN;
                         ELSE next_state2<=NS;Counter_b<=(count_a+count_b)/2;
                         END IF;
            END CASE;
      --进入模式三
      ELSIF(En="10") THEN
            Wr<="10";Ws<="10";Wl<="10";Wc<="01";Nr<="10";Ns<="10";Nl<="10";Nc<="01";
            Er<="10";Es<="10";El<="10";Ec<="01";Sr<="10";Ss<="10";Sl<="10";Sc<="01";
      --进入模式四
      ELSE  
          Wr<="10";Ws<="10";Wl<="10";Wc<="10";Nr<="10";Ns<="10";Nl<="10";Nc<="10";
          Er<="10";Es<="10";El<="10";Ec<="10";Sr<="10";Ss<="10";Sl<="10";Sc<="10";
      END IF;
  END PROCESS;
END ARCHITECTURE;


编译器提示:
Error (10500): VHDL syntax error at Controller.vhd(103) near text "next_state1";  expecting ":=", or "<="
Error (10500): VHDL syntax error at Controller.vhd(153) near text "next_state2";  expecting ":=", or "<="
 楼主| 苍穹的眼泪 发表于 2011-6-8 13:24:32 | 显示全部楼层
自己顶一下
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-23 10:47 , Processed in 0.090380 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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