2016-04-26 20 views
0

Ich arbeite mit VGA auf meinem Basys3 FPGA, und ich möchte derzeit eine Zonenplatte zeichnen, für die die Gleichung ist (1 + cos (k * r^2))/2, wobei r ist der Abstand von der Plattenmitte und k = 2 * pi/lambda ist die Wellenzahl, die den Maßstab der Platte bestimmt. Ich vermute, die beste Vorgehensweise wäre die Verwendung einer Cosinus-LUT, aber ich habe wirklich keine Ahnung, wie ich eine erstellen soll. Ich verstehe die Idee, die dahinter steckt, aber ich weiß nicht, wie ich eine schreiben soll und welche Werte sie enthalten soll.VHDL: Kosinus Lookup Tabelle

Dies ist der Code, den ich zu testen, ich versuche:

Das einzige Problem dabei ist nun, dass ich nicht weiß, was die memory_type :=() mit, füllen Werte so, dass sie die k * r^2 gleich wird aus der Formel.

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 - Horizontalzähler

cstHorAL - nr von Pixeln auf einer aktiven Linie

ich das Bild nicht veröffentlichen können sich wegen des Mangels an guten Ruf, aber das ist, wie es aussehen sollte: http://handforgedvideo.com/wp-content/uploads/2013/02/1920x1080p24_Luma_Zone_Plate_Main.png

Jede Hilfe wird geschätzt. Vielen Dank!

+0

Eine LUT kann als ein ROM erstellt werden, das mit den Funktionswerten initialisiert wird, oder einfach als eine Funktion, die dann durch das Synthesewerkzeug in eine kombinatorische Logik umgewandelt wird.Bitte fügen Sie den Code-Teil, der das Argument und das Ergebnisformat und die Genauigkeit zeigt, für eine bessere Antwort ein. –

+0

Die Sache ist, ich weiß nicht einmal, wie ich anfangen soll. Der Code, den ich hinzugefügt habe, ist, was ich irgendwo anders gefunden habe, und ich versuche es zu testen. Aber ich weiß wirklich nicht, wie es funktioniert, was diese Werte in der Gehäusestruktur sind und wie man diese mit meinen Farbausgängen verbindet, um die Zonenplatte unter Verwendung der obigen Gleichung zu zeichnen. –

Antwort

0

Ihr allgemeiner Code ist nicht zu weit entfernt, aber wie Morten darauf hingewiesen hat, geben Sie nicht das Format der Eingabe (Theta) oder der Ausgaben (sin_data und cos_data) an. Sind sie Fixpunktwerte? Wo ist der Bruchpunkt? Sind das nur ganze Zahlen?

Sie sagen:

ich die beste Vorgehensweise eine Kosinus-LUT zu verwenden wäre bin zu raten, aber ich habe wirklich keine Ahnung, wie man erstellen.

Ich nehme an, Sie meinen mit "LUT" eine generische "Nachschlagetabelle". Die Verwendung von "LUT" ist in Ihrer Frage mehrdeutig, da Sie auch die Basys3 erwähnen. In der FPGA-Literatur ist LUT eine spezielle Art von Logikstruktur auf einem FPGA. Es bedeutet auch "Lookup-Tabelle", aber die Größe und Komplexität sind auf einige wenige digitale Eingänge beschränkt. Es sind keine Cosinus-LUT-Objekte verfügbar. Ich wollte nur klarstellen, dass Sie mit "LUT" eine generische Nachschlagetabelle meinen.

Jetzt ist Ihr Code nicht zu weit entfernt. Es ist in der Tat eine Nachschlagetabelle, die theta übergibt und sin_data und cos_data ausgibt. Die Fragen sind a) ob Ihre Ausgaben genau die Funktion darstellen und b) ob Ihre Implementierung am effizientesten ist oder nicht.

Für ersteres bin ich nicht sicher, da Sie das Eingabe- und Ausgabeformat nicht angeben. Außerdem geben Sie nicht die Zuordnung zwischen ϴ und Ihrer Funktion an. Ist ϴ das Argument zu cos()? Oder ist es k? Oder ist es λ?

Für letztere, sehen Sie sich Xilinx UG901. Es enthält Beispiele für das Ableiten von ROMs (siehe Abschnitt "ROM HDL-Codiertechniken"). Ihr Code wäre, wie geschrieben, wahrscheinlich die am wenigsten effiziente Methode. Sie benötigen zwei Lookup-Tabellen mit je 4K Einträgen (sin_data und cos_data), also zwei 4K x 12bit. Sie wären besser mit einem ROM-Build aus einem Block-RAM.

+0

Das ist das Problem mit geliehenen Code .. Ich verstehe es nicht vollständig. Jedenfalls habe ich versucht, dies mit einem einfacheren Code zu implementieren. Ich werde meinen Beitrag bearbeiten. –

+0

@ LeventeRigán Soll der Code synthetisierbar sein? – PlayDough

+0

Ja, schließlich wäre das das Ziel :) –