Я работаю с VGA на своей FPGA Basys3, и в настоящее время я хочу нарисовать зонную пластину, для которой уравнение (1 + cos (k * r ^ 2)) / 2, где r - расстояние от центра пластины, k=2*pi/lambda — волновое число, определяющее масштаб пластины. Я предполагаю, что лучшим способом действий было бы использование косинусной LUT, но я действительно понятия не имею, как ее создать. Я немного понимаю идею, стоящую за этим, но я не знаю, как ее написать и какие значения она должна содержать.
Это код, который я пытаюсь проверить:
Единственная проблема сейчас в том, что я не знаю, какими значениями заполнить memory_type :=()
, чтобы оно равнялось k*r^2 из формулы.
architecture Behavioral of VGAdraw is
signal i : integer range 0 to 29:=0;
signal r : integer :=2;
type memory_type is array (0 to 29) of integer range -128 to 127;
signal cosine : memory_type :=();
begin
process(CLK)
begin
if (CLK'EVENT and CLK = '1') then
if (cntHor >= 0) AND (cntHor <= cstHorAL - 1) then
RED <= conv_std_logic_vector ((1 - cosine (i)) / 2, 8) (7 downto 4);
GREEN <= conv_std_logic_vector ((1 - cosine (i)) / 2, 8) (7 downto 4);
BLUE <= conv_std_logic_vector ((1 - cosine (i)) / 2, 8) (7 downto 4);
i <= i + 1;
else
RED <= "0000";
GREEN <= "0000";
BLUE <= "0000";
end if;
end if;
end process;
end Behavioral;
cntHor - горизонтальный счетчик
cstHorAL - количество пикселей в активной строке
Я не могу опубликовать само изображение из-за отсутствия репутации, но вот как оно должно выглядеть: http://handforgedvideo.com/wp-content/uploads/2013/02/1920x1080p24_Luma_Zone_Plate_Main.png
Любая помощь приветствуется. Благодарю вас!