VHDL:余弦查找表

时间:2016-04-26 12:59:39

标签: drawing vhdl fpga lookup-tables vga

我正在使用我的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

感谢任何帮助。 谢谢!

1 个答案:

答案 0 :(得分:0)

您的通用代码并不太远,但正如Morten指出的那样,您没有指定输入(theta)或输出(sin_data和cos_data)的格式。它们是固定点值吗?分数点在哪里?它们只是整数吗?

你说:

  

我猜测最好的做法是使用余弦LUT,但我真的不知道如何创建一个。

我认为你的意思是“LUT”是一个通用的“查找表”。在您的问题中使用“LUT”是不明确的,因为您还提到了Basys3。在FPGA文献中,LUT是FPGA上特定类型的逻辑结构。它还意味着“查找表”,但其大小和复杂性仅限于少数数字输入。没有“余弦LUT”对象可用。我只想清楚,“LUT”是指通用查找表。

现在,您的代码并不太远。它确实是一个传递theta和输出sin_datacos_data的查找表。问题是:a)您的输出是否准确地代表了功能; b)您的实施是否最有效。

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

对于后者,请看一下Xilinx UG901。它给出了如何推断ROM的示例(参见“ROM HDL编码技术”部分)。您编写的代码可能是效率最低的方法。您需要两个查找表,每个查找表具有4K条目(sin_datacos_data),因此两个4K x 12位。使用Block RAM进行ROM构建会更好。