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 ответ
Как напомнил мне Брайан Драммонд, проблема заключалась в том, что я написал "иначе, если" вместо эльсифа.