VHDL - вложенные операторы if

У меня есть процесс, определенный в VHDL, как это (я знаю некоторые условия, если операторы не нужны, но я пока игнорирую это):

LSPflag : process(xcolumn, yrow, picture_q_s) -- output of process depends on xcolumn and yrow
    variable RGB : RGB_type; -- output colors
    variable x, y, zx,zy : integer; -- renamed xcolumn and yrow
     variable isPicture:boolean;
    begin
        x:=to_integer(xcolumn); y:=to_integer(yrow); -- convert to integer
        zy:= To_integer(unsigned(xyoffset));
        zx:= (To_integer(unsigned(xyoffset))*XSIZE)/YSIZE;
        RGB:=BLACK;
        if zy>360 then
        --do stuff1 with if statements
        end if;
        if zy>240 then 
        --do stuff2 with if statements
        end if;
        if zy>120 then
        --do stuff3 with if statements
        else
            isPicture:= x>=EMBORGX+centerx-zx and x<EMBORGX+MEMROWSIZE+centerx-zx and y>=EMBORGY+centery+zy and y<EMBORGY+MEMROWCOUNT+centery+zy;               
            if isPicture and picture_q_s = '1'  then--bottomleft corner
                RGB:=YELLOW or RGB;
            end if;
            if  y*XSIZE<=-YSIZE*x+YSIZE*XSIZE+(centery-zy)*XSIZE+(centerx-zx)*YSIZE and  x>=centerx-zx and x<=XSIZE+centerx-zx and y>=centery-zy and y<=YSIZE+centery-zy then--upperleft corner
                RGB:=WHITE or RGB;
            end if;
            if  y*XSIZE>-YSIZE*x+YSIZE*XSIZE+(centery-zy)*XSIZE+(centerx+zx)*YSIZE and x>=centerx+zx and x<=XSIZE+centerx+zx and y>=centery-zy and y<=YSIZE+centery-zy and y*XSIZE<YSIZE*x-(2*zy)*XSIZE then--upperright corner
                RGB:=RED or RGB;
            end if;
            if y*XSIZE>-YSIZE*x+YSIZE*XSIZE+(centery+zy)*XSIZE+(centerx+zx)*YSIZE and  x>=centerx+zx and x<=XSIZE+centerx+zx and y>=centery+zy and y<=YSIZE+centery+zy and y*XSIZE>YSIZE*x then--bottomright corner
                RGB:=BLUE or RGB;
            end if;
            if isPicture then
                picture_address_s <= std_logic_vector(to_unsigned((y-EMBORGY-centery-zy)*MEMROWSIZE + (x-EMBORGX-centerx+zx), picture_address_s'LENGTH));
            else 
                picture_address_s <=(others=>'0'); 
            end if;
        end if;
        VGA_R<=RGB.R; VGA_G<=RGB.G; VGA_B<=RGB.B;
    end process;

Я хотел, чтобы программа перестала проверять 4 внешних условия после того, как она найдет истинное. Если я напишу это как выше, это работает, но оно проверяет первое из трех условий всегда, несмотря ни на что. Я пытался сделать что-то вроде этого:

        if zy>360 then
        --do stuff with if statements1          
        else if zy>240 then 
        --do stuff with if statements2 
        else if zy>120 then
        --do stuff with if statements3 
        else
            isPicture:= x>=EMBORGX+centerx-zx and x<EMBORGX+MEMROWSIZE+centerx-zx and y>=EMBORGY+centery+zy and y<EMBORGY+MEMROWCOUNT+centery+zy;               
            if isPicture and picture_q_s = '1'  then--bottomleft corner
                RGB:=YELLOW or RGB;
            end if;
            if  y*XSIZE<=-YSIZE*x+YSIZE*XSIZE+(centery-zy)*XSIZE+(centerx-zx)*YSIZE and  x>=centerx-zx and x<=XSIZE+centerx-zx and y>=centery-zy and y<=YSIZE+centery-zy then--upperleft corner
                RGB:=WHITE or RGB;
            end if;
            if  y*XSIZE>-YSIZE*x+YSIZE*XSIZE+(centery-zy)*XSIZE+(centerx+zx)*YSIZE and x>=centerx+zx and x<=XSIZE+centerx+zx and y>=centery-zy and y<=YSIZE+centery-zy and y*XSIZE<YSIZE*x-(2*zy)*XSIZE then--upperright corner
                RGB:=RED or RGB;
            end if;
            if y*XSIZE>-YSIZE*x+YSIZE*XSIZE+(centery+zy)*XSIZE+(centerx+zx)*YSIZE and  x>=centerx+zx and x<=XSIZE+centerx+zx and y>=centery+zy and y<=YSIZE+centery+zy and y*XSIZE>YSIZE*x then--bottomright corner
                RGB:=BLUE or RGB;
            end if;
            if isPicture then
                picture_address_s <= std_logic_vector(to_unsigned((y-EMBORGY-centery-zy)*MEMROWSIZE + (x-EMBORGX-centerx+zx), picture_address_s'LENGTH));
            else 
                picture_address_s <=(others=>'0'); 
            end if;
        end if;

Но тогда он не компилируется, и он говорит, ожидается ли утверждение около текстового процесса.

1 ответ

Как напомнил мне Брайан Драммонд, проблема заключалась в том, что я написал "иначе, если" вместо эльсифа.

Другие вопросы по тегам