我正在使用我的Basys3 FPGA上的VGA,我目前想绘制一个波段,其等式为(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 - 活动行上的nr像素
由于缺乏声誉,我无法发布图片,但这应该是这样的:http://handforgedvideo.com/wp-content/uploads/2013/02/1920x1080p24_Luma_Zone_Plate_Main.png
感谢任何帮助。 谢谢!
答案 0 :(得分:0)
您的通用代码并不太远,但正如Morten指出的那样,您没有指定输入(theta)或输出(sin_data和cos_data)的格式。它们是固定点值吗?分数点在哪里?它们只是整数吗?
你说:
我猜测最好的做法是使用余弦LUT,但我真的不知道如何创建一个。
我认为你的意思是“LUT”是一个通用的“查找表”。在您的问题中使用“LUT”是不明确的,因为您还提到了Basys3。在FPGA文献中,LUT是FPGA上特定类型的逻辑结构。它还意味着“查找表”,但其大小和复杂性仅限于少数数字输入。没有“余弦LUT”对象可用。我只想清楚,“LUT”是指通用查找表。
现在,您的代码并不太远。它确实是一个传递theta
和输出sin_data
和cos_data
的查找表。问题是:a)您的输出是否准确地代表了功能; b)您的实施是否最有效。
对于前者,我不确定,因为您没有指定输入和输出格式。此外,您不指定Θ和函数之间的映射。 Θ是cos()的参数吗?还是k?还是λ?
对于后者,请看一下Xilinx UG901。它给出了如何推断ROM的示例(参见“ROM HDL编码技术”部分)。您编写的代码可能是效率最低的方法。您需要两个查找表,每个查找表具有4K条目(sin_data
和cos_data
),因此两个4K x 12位。使用Block RAM进行ROM构建会更好。