我正在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
任何帮助,不胜感激。谢谢!
你的一般代码并不太遥远,但正如Morten指出的那样,你没有指定输入(theta)或输出(sin_data和cos_data)的格式。 它们是不动点值吗? 小数点在哪里? 它们只是整数吗?
你说:
我猜最好的做法是使用余弦LUT,但我真的不知道如何创建一个。
我想你的意思是"LUT"是一个通用的"查找表"。 "LUT"的使用在您的问题中是模棱两可的,因为您还提到了 Basys3。 在FPGA文献中,LUT是FPGA上一种特定类型的逻辑结构。 它也意味着"查找表",但大小和复杂性仅限于几个数字输入。 没有可用的"余弦 LUT"对象。 我只是想澄清一下,"LUT"是指通用查找表。
现在,您的代码不会太远。 它确实是一个查找表,用于传入theta
并输出sin_data
和cos_data
。 问题是 a) 你的输出是否准确地代表了函数,b) 你的实现是否是最有效的。
对于前者,我不确定,因为您没有指定输入和输出格式。 此外,您没有指定 Θ 和函数之间的映射。 Θ 是 cos() 的参数吗? 还是k? 还是λ?
对于后者,请查看赛灵思UG901。 它给出了如何推断 ROM 的示例(请参阅"ROM HDL 编码技术"部分)。 编写的代码可能是效率最低的方法。 您需要两个查找表,每个查找表都有 4K 条目(sin_data
和 cos_data
),因此两个 4K x 12 位。 你最好从块RAM构建ROM构建。