VHDL:余弦查找表



我正在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_datacos_data。 问题是 a) 你的输出是否准确地代表了函数,b) 你的实现是否是最有效的。

对于前者,我不确定,因为您没有指定输入和输出格式。 此外,您没有指定 Θ 和函数之间的映射。 Θ 是 cos() 的参数吗? 还是k? 还是λ?

对于后者,请查看赛灵思UG901。 它给出了如何推断 ROM 的示例(请参阅"ROM HDL 编码技术"部分)。 编写的代码可能是效率最低的方法。 您需要两个查找表,每个查找表都有 4K 条目(sin_datacos_data ),因此两个 4K x 12 位。 你最好从块RAM构建ROM构建。

最新更新