Picproje Elektronik Sitesi

DİJİTAL & ANALOG ELEKTRONİK => Pld, Spld, Pal, Gal, Cpld, Fpga => Konuyu başlatan: OnePeso - 22 Mayıs 2021, 12:07:52

Başlık: VHDL diliyle cocktail sort algoritması ve simüle etme(Vivado)
Gönderen: OnePeso - 22 Mayıs 2021, 12:07:52
İ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.
Başlık: Ynt: VHDL diliyle cocktail sort algoritması ve simüle etme(Vivado)
Gönderen: devrecii - 22 Mayıs 2021, 14:39:29
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. 
Başlık: Ynt: VHDL diliyle cocktail sort algoritması ve simüle etme(Vivado)
Gönderen: OnePeso - 22 Mayıs 2021, 14:59:44
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/)
Başlık: Ynt: VHDL diliyle cocktail sort algoritması ve simüle etme(Vivado)
Gönderen: MC_Skywalker - 23 Mayıs 2021, 14:06:12
https://fdocuments.in/document/vhdl-implementation-of-merge-sort-algorithm.html