İyi günler, bilgisayar mühendisliği son sınıf öğrencisiyim. Vivado yazılımı üzerinden VHDL diliyle cocktail sort algoritması tasarımını yaparak simülasyon ve uygulamanın çalıştırılması gerekiyor. Programın doğruluğunun kontrolü için Testbench de gerekli. Input ve Output dizilerinin, veri tipi ve ve dizi uzunluğunu kendimiz belirleyebiliyoruz.
Aldığım bir ders için verilen bir ödev ama VHDL dili ve Vivado programı ile ilk defa çalıştığım için beni çok zorluyor genel olarak mantığını kavrayamadım. Kendim uğraştım ama işin içinden bir türlü çıkamadım.
Üzerinde uğraştığım örnek kod:
----------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
package package_name is
type t_vector is array (0 to 5) of integer;
end package_name;
use work.package_name.all;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity CocktailSort_ent is
port( clk: in std_logic;
input_array: in t_vector;
output_array: out t_vector
);
end CocktailSort_ent;
architecture CocktailSort_beh of CocktailSort_ent is
signal swapped : boolean := true;
signal start : integer := 0;
signal temp : integer range 0 to 50;
signal son : integer := 6;
signal a_array : t_vector;
begin
process(clk)
begin
if (clk = '1' and clk'event) then
a_array <= input_array;
while swapped = true loop
for i in 0 to 3 loop
if a_array(i + 1) > a_array(i + 2) then
temp <= a_array(i + 1);
a_array(i + 1) <= a_array(i + 2);
a_array(i + 2) <= temp;
swapped <= true;
end if;
end loop;
if (swapped = false) then
exit;
end if;
swapped <= false;
son <= son - 1;
for i in 3 downto 0 loop
if a_array(i + 1) > a_array(i + 2) then
temp <= a_array(i + 1);
a_array(i + 1) <= a_array(i + 2);
a_array(i + 2) <= temp;
swapped <= true;
end if;
end loop;
start <= start + 1;
end loop;
end if;
output_array <= a_array;
end process;
end CocktailSort_beh;
Çok hatalı olduğunu biliyorum ama ilerisine gidemiyorum tıkandım, yardımcı olabilirseniz çok sevinirim.
Benim burada gördüğüm tüm arrayı devreye sokmamıssın, bir interger ile arrayrı saydırman gerekir , hep 0 ile 3 arasını kontol etmişsin bunun için for döngüsüne gerek yok ve aynı rutini iki defa yazmaya da gerek yok.
start <= start + 1; son <= son - 1; mesela sisteme bunları sokmamıssın bunlar adresleme mi yapıyor.
VHDL mantığını tam anlayamadığım için algoritmanın c# halini anladığım kadarı ile çevirerek entegre etmeye çalıştım, bundan kaynaklı kod kısmım yanlış. Dediğiniz kısımda adresleme yapma amacı ile kullanmadım. Örnek aldığım algoritma : Algoritmam ve c# hali (https://www.geeksforgeeks.org/cocktail-sort/)
https://fdocuments.in/document/vhdl-implementation-of-merge-sort-algorithm.html