VHDL: Tabel Pencarian Cosinus

Saya bekerja dengan VGA di Basys3 FPGA saya, dan saat ini saya ingin menggambar pelat zona, yang persamaannya adalah (1 + cos(k*r^2)) / 2, di mana r adalah jarak dari pusat pelat, dan k=2*pi/lambda adalah bilangan gelombang, yang menentukan skala pelat. Saya kira tindakan terbaik adalah menggunakan LUT kosinus, tapi saya benar-benar tidak tahu cara membuatnya. Saya agak memahami ide di baliknya, tapi saya tidak tahu bagaimana cara menulisnya dan nilai apa yang harus dikandungnya.

Ini adalah kode yang saya coba uji:

Satu-satunya masalah dengan ini sekarang adalah saya tidak tahu nilai apa yang harus diisi memory_type :=(), sehingga sama dengan k*r^2 dari rumus.

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 - penghitung horizontal

cstHorAL - jumlah piksel pada saluran aktif

Saya tidak dapat memposting gambar itu sendiri karena kurangnya reputasi, namun seperti inilah tampilannya: http://handforgedvideo.com/wp-content/uploads/2013/02/1920x1080p24_Luma_Zone_Plate_Main.png

Bantuan apa pun dihargai. Terima kasih!


person Levente Rigán    schedule 26.04.2016    source sumber
comment
LUT dapat dibuat sebagai ROM yang diinisialisasi dengan nilai fungsi, atau hanya sebagai fungsi yang kemudian diubah menjadi logika kombinatorial oleh alat sintesis. Harap sertakan bagian kode yang menunjukkan argumen dan format hasil serta presisi untuk jawaban yang lebih baik.   -  person Morten Zilmer    schedule 26.04.2016
comment
Masalahnya, saya bahkan tidak tahu bagaimana memulainya. Kode yang saya tambahkan adalah apa yang saya temukan di tempat lain, dan saya mencoba mengujinya. Tapi saya benar-benar tidak tahu cara kerjanya, nilai apa yang ada dalam struktur kasus dan bagaimana menghubungkannya ke keluaran warna saya untuk menggambar pelat zona menggunakan persamaan di atas.   -  person Levente Rigán    schedule 26.04.2016


Jawaban (1)


Kode umum Anda tidak terlalu jauh, tetapi seperti yang ditunjukkan Morten, Anda tidak menentukan format input (theta) atau output (sin_data dan cos_data). Apakah nilai poinnya tetap? Dimana titik pecahannya? Apakah semuanya hanya bilangan bulat?

Kamu bilang:

Saya kira tindakan terbaik adalah menggunakan LUT kosinus, tapi saya benar-benar tidak tahu cara membuatnya.

Saya kira yang Anda maksud dengan "LUT" adalah "tabel pencarian" yang umum. Penggunaan "LUT" bersifat ambigu dalam pertanyaan Anda karena Anda juga menyebutkan Basys3. Dalam literatur FPGA, LUT adalah jenis struktur logika khusus pada FPGA. Ini juga berarti "tabel pencarian", namun ukuran dan kompleksitasnya terbatas pada beberapa input digital. Tidak ada objek "cosinus LUT" yang tersedia. Saya hanya ingin memperjelas bahwa yang Anda maksud dengan "LUT" adalah tabel pencarian umum.

Sekarang, kode Anda tidak terlalu jauh. Ini memang tabel pencarian untuk meneruskan theta dan keluaran sin_data dan cos_data. Pertanyaannya adalah a) apakah output Anda secara akurat mewakili fungsi dan b) apakah implementasi Anda paling efisien atau tidak.

Untuk yang pertama, saya tidak yakin karena Anda tidak menentukan format input dan output. Selain itu, Anda tidak menentukan pemetaan antara ϴ dan fungsi Anda. Apakah ϴ argumen untuk cos()? Atau itu k? Atau itu?

Untuk yang terakhir, lihat Xilinx UG901. Ini memberikan contoh bagaimana menyimpulkan ROM (lihat bagian 'Teknik Pengkodean ROM HDL'). Kode Anda, seperti yang tertulis, mungkin merupakan metode yang paling tidak efisien. Anda memerlukan dua tabel pencarian dengan masing-masing entri 4K (sin_data dan cos_data), jadi dua 4K x 12bit. Anda akan lebih baik menggunakan ROM yang dibuat dari blok RAM.

person PlayDough    schedule 26.04.2016
comment
Itulah masalah dengan kode pinjaman.. Saya tidak sepenuhnya memahaminya. Bagaimanapun, saya mencoba menerapkan ini menggunakan kode yang lebih sederhana. Saya akan mengedit posting saya. - person Levente Rigán; 26.04.2016
comment
@LeventeRigán Apakah Anda ingin kodenya dapat disintesis? - person PlayDough; 26.04.2016
comment
Ya, pada akhirnya, itulah tujuannya :) - person Levente Rigán; 27.04.2016
comment
Jika tujuan Anda adalah kode yang dapat disintesis, Anda tidak dapat menggunakan cos() seperti yang Anda tulis. Anda mensintesis sinyal berdasarkan fungsi seperti ini. Namun Anda dapat memperoleh konstanta dari cos(). Saya sarankan Anda mencari gaya untuk mensintesis ROM melalui UG901, kemudian menginisialisasi konten ROM (nilai awal adalah nilai konstan) dengan panggilan ke cos(). - person PlayDough; 27.04.2016
comment
Oke, saya sudah memeriksanya, dan sepertinya kode saya sebelumnya sedikit lebih mirip dengan tampilan process(CLK). Tapi saya masih belum tahu bagaimana caranya sampai ke bagian menggambar. Saya menetapkan konstanta yang saya peroleh dari cos() ke keluaran warna? - person Levente Rigán; 27.04.2016
comment
@LeventeRigán Saya bukan ahli VGA, jadi saya tidak yakin bagaimana cara menghasilkan output VGA. Namun saya dapat berbicara dengan keluaran cos() dan sin() Anda berdasarkan beberapa masukan. Saya mengerti bahwa Anda ingin menghitung 1 + cos(k*r^2). Apakah k masukannya? Apakah r sebuah konstanta? Masih belum jelas apa input dan output Anda atau bagaimana formatnya. Apakah bilangan bulat? Titik pasti? Berikan lebih detail mengenai input dan outputnya dan saya dapat memberikan bantuan lebih lanjut. - person PlayDough; 27.04.2016