VHDL: ตารางค้นหาโคไซน์

ฉันกำลังทำงานกับ VGA บน Basys3 FPGA ของฉัน และตอนนี้ฉันต้องการวาดโซนเพลต ซึ่งสมการคือ (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 - จำนวนพิกเซลบนบรรทัดที่ใช้งานอยู่

ฉันไม่สามารถโพสต์ภาพได้เนื่องจากขาดชื่อเสียง แต่ภาพควรมีลักษณะดังนี้: http://handforgedvideo.com/wp-content/uploads/2013/02/1920x1080p24_Luma_Zone_Plate_Main.png

ความช่วยเหลือใด ๆ ที่ชื่นชม ขอบคุณ!


person Levente Rigán    schedule 26.04.2016    source แหล่งที่มา
comment
LUT สามารถสร้างเป็น ROM ที่เริ่มต้นด้วยค่าฟังก์ชัน หรือเพียงแค่เป็นฟังก์ชันที่ถูกแปลงเป็นตรรกะเชิงผสมผสานโดยเครื่องมือสังเคราะห์ โปรดรวมส่วนของโค้ดที่แสดงอาร์กิวเมนต์และรูปแบบผลลัพธ์และความแม่นยำเพื่อให้ได้คำตอบที่ดียิ่งขึ้น   -  person Morten Zilmer    schedule 26.04.2016
comment
ประเด็นคือฉันไม่รู้ด้วยซ้ำว่าจะเริ่มต้นอย่างไร รหัสที่ฉันเพิ่มคือสิ่งที่ฉันพบที่อื่น และฉันกำลังพยายามทดสอบ แต่ฉันไม่รู้จริงๆ ว่ามันทำงานอย่างไร ค่าเหล่านั้นในโครงสร้างเคสคืออะไร และจะเชื่อมต่อสิ่งนี้กับเอาท์พุตสีของฉันเพื่อวาดแผ่นโซนโดยใช้สมการข้างต้นได้อย่างไร   -  person Levente Rigán    schedule 26.04.2016


คำตอบ (1)


รหัสทั่วไปของคุณอยู่ไม่ไกลเกินไป แต่อย่างที่ Morten ชี้ให้เห็น คุณไม่ได้ระบุรูปแบบของอินพุต (theta) หรือเอาต์พุต (sin_data และ cos_data) เป็นค่าจุดคงที่หรือไม่? จุดเศษส่วนอยู่ที่ไหน? มันเป็นเพียงจำนวนเต็มเหรอ?

คุณพูด:

ฉันเดาว่าแนวทางปฏิบัติที่ดีที่สุดคือการใช้โคไซน์ LUT แต่ฉันไม่รู้ว่าจะสร้างได้อย่างไร

ฉันคิดว่าคุณหมายถึง "LUT" ซึ่งเป็น "ตารางค้นหา" ทั่วไป การใช้ "LUT" นั้นคลุมเครือในคำถามของคุณเนื่องจากคุณพูดถึง Basys3 ด้วย ในวรรณกรรม FPGA LUT เป็นโครงสร้างลอจิกประเภทหนึ่งบน FPGA นอกจากนี้ยังหมายถึง "ตารางค้นหา" แต่ขนาดและความซับซ้อนนั้นจำกัดอยู่ที่อินพุตดิจิทัลบางตัวเท่านั้น ไม่มีวัตถุ "โคไซน์ LUT" ที่พร้อมใช้งาน ฉันแค่อยากให้ชัดเจนว่าโดย "LUT" คุณหมายถึงตารางการค้นหาทั่วไป

ตอนนี้รหัสของคุณอยู่ไม่ไกลเกินไป มันเป็นตารางการค้นหาที่จะส่งผ่านใน theta และเอาต์พุต sin_data และ cos_data คำถามคือ ก) ผลลัพธ์ของคุณแสดงถึงฟังก์ชันได้อย่างถูกต้องหรือไม่ และ ข) การใช้งานของคุณมีประสิทธิภาพมากที่สุดหรือไม่

สำหรับแบบแรก ฉันไม่แน่ใจเนื่องจากคุณไม่ได้ระบุรูปแบบอินพุตและเอาต์พุต นอกจากนี้ คุณไม่ได้ระบุการแมประหว่าง ϴ กับฟังก์ชันของคุณ ϴ เป็นอาร์กิวเมนต์ของ cos() หรือไม่ หรือว่าเค? หรือมันคือเล?

สำหรับอย่างหลัง โปรดดูที่ Xilinx UG901. โดยจะให้ตัวอย่างวิธีอนุมาน ROM (ดูหัวข้อ 'เทคนิคการเข้ารหัส ROM HDL') ตามที่เขียนไว้โค้ดของคุณอาจเป็นวิธีที่มีประสิทธิภาพน้อยที่สุด คุณต้องมีตารางค้นหาสองตารางที่มีรายการ 4K แต่ละรายการ (sin_data และ cos_data) ดังนั้น 4K x 12 บิตสองรายการ คุณน่าจะดีกว่าถ้าใช้ ROM build จาก block RAM

person PlayDough    schedule 26.04.2016
comment
นั่นคือปัญหาของรหัสที่ยืมมา.. ฉันไม่เข้าใจมันทั้งหมด อย่างไรก็ตาม ฉันพยายามใช้โค้ดที่ง่ายกว่านี้ ฉันจะแก้ไขโพสต์ของฉัน - person Levente Rigán; 26.04.2016
comment
@LeventeRigán คุณตั้งใจให้โค้ดสังเคราะห์ได้หรือไม่? - person PlayDough; 26.04.2016
comment
ใช่แล้ว ในที่สุดนั่นก็จะเป็นเป้าหมาย :) - person Levente Rigán; 27.04.2016
comment
หากเป้าหมายของคุณคือโค้ดที่สังเคราะห์ได้ คุณจะไม่สามารถใช้ cos() ตามที่เขียนไว้ได้ คุณสังเคราะห์สัญญาณตามฟังก์ชันเช่นนี้ อย่างไรก็ตาม คุณสามารถรับค่าคงที่จาก cos() ฉันขอแนะนำให้คุณดู UG901 เพื่อดูสไตล์ในการสังเคราะห์ ROM จากนั้นเริ่มต้นเนื้อหา ROM (ค่าเริ่มต้นคือค่าคงที่) ด้วยการเรียก cos() - person PlayDough; 27.04.2016
comment
ตกลง ฉันตรวจสอบแล้ว และดูเหมือนว่าโค้ดก่อนหน้าของฉันจะใกล้เคียงกับ process(CLK) มากขึ้นเล็กน้อย แต่แล้วฉันก็ยังไม่รู้ว่าจะไปถึงส่วนวาดรูปได้อย่างไร ฉันกำหนดค่าคงที่ที่ฉันได้รับจาก cos() ให้กับเอาต์พุตสีหรือไม่ - person Levente Rigán; 27.04.2016
comment
@LeventeRigán ฉันไม่ใช่ผู้เชี่ยวชาญ VGA ดังนั้นฉันไม่แน่ใจว่าจะสร้างเอาต์พุต VGA ได้อย่างไร แต่ฉันสามารถพูดคุยกับรุ่น cos() และ sin() เอาต์พุตของคุณได้โดยอิงตามอินพุตบางอย่าง ฉันเข้าใจว่าคุณต้องการคำนวณ 1 + cos(k*r^2) k เป็นอินพุตหรือไม่ r เป็นค่าคงที่หรือไม่ ยังไม่ชัดเจนว่าอินพุตและเอาต์พุตของคุณคืออะไรหรือจัดรูปแบบอย่างไร เป็นจำนวนเต็มหรือเปล่า? จุดคงที่? ให้รายละเอียดเพิ่มเติมเกี่ยวกับอินพุตและเอาต์พุต และฉันสามารถให้ความช่วยเหลือเพิ่มเติมได้ - person PlayDough; 27.04.2016