Ошибка VHDL (10479): индексированный тип имени используется, но не объявлен - PullRequest
0 голосов
/ 24 февраля 2020

Я пишу код для контроллера нечеткой логики c, и в строке 69 появляется ошибка: Ошибка (10479): индексированный тип имени используется, но не объявлен! В этой строке я объявил подтип и тип, который я использую для объявления нескольких матриц векторов:

subtype mf_range is unsigned(7 downto 0) range x"00" to x"3D";
type membership_functions is array (0 to 3) of mf_range;

constant MF_BVR_M           : membership_functions := (x"00", x"00", x"05", x"0F");
constant MF_BVR_S           : membership_functions := (x"05", x"0A", x"14", x"19");
constant MF_BVR_MN      : membership_functions := (x"0F", x"19", x"1E", x"1E");

constant MF_TSJTIZ_K    : membership_functions := (x"00", x"00", x"0A", x"1E");
constant MF_TSJTIZ_S    : membership_functions := (x"0A", x"14", x"28", x"32");
constant MF_TSJTIZ_D    : membership_functions := (x"1E", x"32", x"3C", x"3C");

constant MF_PS_M            : membership_functions := (x"00", x"00", x"05", x"0A");
constant MF_PS_S            : membership_functions := (x"05", x"0A", x"0A", x"0F");
constant MF_PS_V            : membership_functions := (x"0A", x"0F", x"14", x"14");

constant MF_TSJTIZNEXT_K: membership_functions := (x"00", x"00", x"0A", x"1E");
constant MF_TSJTIZNEXT_S: membership_functions := (x"0A", x"14", x"28", x"32");
constant MF_TSJTIZNEXT_D: membership_functions := (x"1E", x"32", x"3C", x"3C");

Ошибка указывает на первую строку кода выше.

Часть кода, который использует эта матрица:

pure function fuzzification_kalkulator(  mf : membership_functions;
                                                      x  : unsigned(7 downto 0)) return unsigned is                                                 
variable mikro  : unsigned(7 downto 0) := x"00";
variable slope1 : unsigned(7 downto 0) := x"00";
variable slope2 : unsigned(7 downto 0) := x"00";

    begin
        if (mf(0)=0 and mf(1)=0) or (mf(2)=0 and mf(3)=0) then
            slope1 := x"00";
            slope1 := x"00";
        else
            slope1 := x"FF"/(mf(1)-mf(0));
            slope2 := x"FF"/(mf(3)-mf(2));
        end if;
        if (mf(0) /= mf(1) and mf(2) /= mf(3)) then
            if (x < mf(0) or x > mf(3)) then
                mikro := x"00";
            elsif (x >= mf(1) and x < mf(2)) then
                mikro := x"FF"; -- vrednost x"FF" je reprezentacija vrednosti 1
            elsif (x >= mf(0) and x < mf(1)) then                   
                mikro := x"FF" - ((mf(1) - x)*slope1);
            elsif (x >= mf(2) and x <= mf(3)) then
                mikro := x"FF" - ((x-mf(2))*slope2);
            end if;
        elsif (mf(0) = mf(1)) then
            if (x > mf(1) and x < mf(2)) then
                mikro := x"FF";
            elsif (x > mf(3)) then
                mikro := x"00";
            elsif (x >= mf(2) and x <= mf(3)) then
                mikro := x"FF" - ((x-mf(2))*slope2);
            end if;
        elsif (mf(2) = mf(3)) then
            if (x >= mf(1) and x <= mf(2)) then
                mikro := x"FF";
            elsif (x < mf(0) or x > mf(3)) then
                mikro := x"00";
            elsif (x >= mf(0) and x < mf(1)) then
                mikro := x"FF" - ((mf(1) - x)*slope1);
            end if;
        end if;
        return mikro;               
    end function;

begin
TSJ_TIZNEXT <= std_logic_vector(TSJTIZ_bafer);

read_in_state: process(clock)
begin                   
    case enable_FLC is
        when '1' =>
                BV_R_bafer <= unsigned(BV_R);
                PS_bafer <= unsigned(PS);
                enableFLC_bafer <= enable_FLC;
        when '0' =>
                enableFLC_bafer <= enable_FLC;                                                  
        when others =>      
            enableFLC_bafer <= enable_FLC;
    end case;
   end process;

fuzzification: process(clock)
begin
if rising_edge(clock) then
    if (enableFLC_bafer = '1') then         
                mikroBVR_M    <= fuzzification_kalkulator(MF_BVR_M, BV_R_bafer);
                mikroBVR_S    <= fuzzification_kalkulator(MF_BVR_S, BV_R_bafer);
                mikroBVR_MN   <= fuzzification_kalkulator(MF_BVR_MN, BV_R_bafer);
                mikroTSJTIZ_K <= fuzzification_kalkulator(MF_TSJTIZ_K, TSJTIZ_bafer);
                mikroTSJTIZ_S <= fuzzification_kalkulator(MF_TSJTIZ_S, TSJTIZ_bafer);
                mikroTSJTIZ_D <= fuzzification_kalkulator(MF_TSJTIZ_D, TSJTIZ_bafer);
                mikroPS_M     <= fuzzification_kalkulator(MF_PS_M, PS_bafer);
                mikroPS_S     <= fuzzification_kalkulator(MF_PS_S, PS_bafer);
                mikroPS_V     <= fuzzification_kalkulator(MF_PS_V, PS_bafer);
            end if;
        end if;
    end process;

Я начинающий с VHDL. Я проверяю синтаксис кучу времени, не могу найти ошибку. Чего мне не хватает ...?

...