2016-04-26 2 views
0

Я работаю с VGA на моей FPSGA Basys3, и сейчас я хочу нарисовать зонную пластинку, для которой уравнение (1 + cos (k * r^2))/2, где r - расстояние от центра пластины, а k = 2 * pi/lambda - волновое число, которое определяет масштаб пластины. Я предполагаю, что лучший способ действий - использовать косинус LUT, но я действительно не знаю, как его создать. Я несколько понимаю идею этого, но я не знаю, как написать одно и какие значения он должен содержать.VHDL: таблица косинусоидального поиска

Это код, который я пытаюсь проверить:

Единственная проблема с этим сейчас, что я не знаю, какие ценности для заполнения memory_type :=() с, так что он будет равен к * г^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

Любая помощь приветствуется. Спасибо!

+0

LUT может быть выполнен как ПЗУ, которое инициализируется значениями функций или просто как функция, которая затем преобразуется в комбинаторную логику с помощью инструмента синтеза.Пожалуйста, добавьте часть кода, которая показывает аргумент и формат результата и точность для более лучшего ответа. –

+0

Дело в том, что я даже не знаю, с чего начать. Код, который я добавил, это то, что я нашел где-то еще, и я пытаюсь проверить его. Но я действительно не знаю, как это работает, каковы эти значения в структуре случая и как подключить это к моим цветовым выходам, чтобы рисовать зонную пластинку, используя приведенное выше уравнение. –

ответ

0

Ваш общий код не слишком далеко, но, как указал Мортен, вы не указываете формат ввода (тета) или выходов (sin_data и cos_data). Являются ли они фиксированными значениями точки? Где дробная точка? Являются ли они целыми числами?

Вы говорите:

Я предполагаю, что лучший курс действий будет использовать косинус LUT, но я действительно не знаю, как создать.

Возможно, вы подразумеваете под «LUT» общую «таблицу поиска». Использование «LUT» неоднозначно в вашем вопросе, так как вы также упоминаете Basys3. В литературе FPGA LUT представляет собой специфический тип логической структуры на FPGA. Это также означает «таблица поиска», но размер и сложность ограничены несколькими цифровыми входами. Объектов «косинус LUT» нет. Я просто хотел понять, что под «LUT» вы подразумеваете общую таблицу поиска.

Теперь ваш код не за горами. Это действительно справочная таблица для передачи в theta и вывода sin_data и cos_data. Задачами являются: а) независимо от того, точно ли ваши результаты точно представляют функцию и б) является ли ваша реализация наиболее эффективной.

Для первого, я не уверен, так как вы не указываете формат ввода и вывода. Кроме того, вы не указываете сопоставление между ϴ и вашей функцией. Является ли ϴ аргументом для cos()? Или это k? Или это λ?

Для последнего взгляните на Xilinx UG901. В нем приводятся примеры того, как выводить ПЗУ (см. Раздел «Методы кодирования ПЗУ HDL»). Ваш код, как написано, вероятно, будет наименее эффективным методом. Вам нужны две таблицы поиска с 4 Кбайтами (sin_data и cos_data), поэтому два 4K x 12bit. Вам будет лучше с сборкой ROM из блока RAM.

+0

Это проблема с заимствованным кодом .. Я не совсем понимаю это. Во всяком случае, я попытался реализовать это, используя более простой код. Я отредактирую свой пост. –

+0

@ LeventeRigán Вы намерены использовать код, синтезируемый? – PlayDough

+0

Да, в конце концов, это была бы цель :) –