2016-04-26 186 views
0

我在我的Basys3 FPGA上使用VGA,我当前想绘制一个带板,其方程为(1 + cos(k * r^2))/ 2,其中r是距板中心的距离,k = 2 * pi/lambda是波数,它决定了板的比例。我猜测最好的方法是使用余弦LUT,但我真的不知道如何创建一个。我有点理解它背后的想法,但我不知道如何写一个它应该包含什么值。VHDL:余弦查找表

这是我想测试一下代码:

与此唯一的问题是现在,我不知道是什么值来填充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

LUT可以作为一个ROM函数初始化为函数值,或者简单地作为一个函数,然后由综合工具转换为组合逻辑。请包含显示参数和结果格式和精度的代码部分,以获得更好的答案。 –

+0

事情是,我甚至不知道如何开始。我添加的代码是我在其他地方找到的,我试图对其进行测试。但我真的不知道它是如何工作的,这种情况下结构中的这些值是什么,以及如何将它与我的颜色输出连接以使用上述等式绘制波带片。 –

回答

0

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

你说:

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

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

现在,您的代码不会太远。这确实是一个查找表,通过theta并输出sin_datacos_data。问题是a)你的输出是否准确地代表了函数,b)你的实现是否是最有效的。

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

对于后者,请查看Xilinx UG901。它给出了如何推断ROM的例子(参见'ROM HDL Coding Techniques'部分)。正如你所写的,你的代码可能是效率最低的方法。您需要两个分别具有4K条目的查找表(sin_datacos_data),因此两个4K x 12bit。使用Block RAM构建ROM会更好。

+0

这是借用代码的问题..我不完全理解它。无论如何,我试图用更简单的代码来实现这一点。我将编辑我的帖子。 –

+0

@LeventeRigán你打算通过合成代码吗? – PlayDough

+0

是的,最终,这将是目标:) –