logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Dzielenie w VHDL. Liczby binarne stałoprzecinkowe.

pkwiatkowski 15 Lut 2009 18:40 3593 6
REKLAMA
  • #1 6154639
    pkwiatkowski
    Poziom 11  
    Posty: 8
    Jak zrealizować dzielenie dwóch liczb binarnych stałoprzecinkowych w VHDL?

    Byłbym wdzięczny za wszelkie linki lub tytuły książek w których mógłbym coś znaleźć na temat programowej realizacji operacji arytmetycznych (dodawanie, odejmowanie, mnożenie, dzielenie, potęgowanie, pierwiastkowanie)
  • REKLAMA
  • Pomocny post
    #2 6157684
    _greis_
    Poziom 14  
    Posty: 70
    Pomógł: 9
    Ocena: 1
    sposobów jest multum. wszystkie z wymienionych przez ciebie operacji są bardzo dobrze opisane na praktycznie każdej stronie zajmującej się układami programowalnymi. te zagadnienia możesz szukać na stronach uczelnianych (typowe zagadanienie akademickie :))
    ze swej strony polecam zajżeć w to miejsce
  • REKLAMA
  • #3 6202366
    mariusz102102
    Poziom 12  
    Posty: 67
    Pomógł: 2
    Ja zamiast wlasnych implementacji polecam (ponownie :) ) pakiet fixed_pkg dostepny oficjalnie wraz z nowym standardem VHDL 2006.

    Zalety:
    - sprawdzone, standard VHDL 2006
    - parametryzowane ze wzgledu na szerokosc danych wejsciowych, dokladnosc obliczen, sposob zaokraglania itp..

    Pozdrawiam
    Mariusz
  • REKLAMA
  • #4 6206031
    bartekgajos
    Poziom 14  
    Posty: 73
    Pomógł: 5
    Ocena: 2
    Witam

    library IEEE;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    
    Entity DIVIDER is
    	port(
    		CLK					: in std_logic; -- 8MHz input clock
    		RESET				: in std_logic; -- Active Low reset signal
    		NUMERATOR			: in std_logic_vector(7 downto 0); 
    		DENOMINATOR			: in std_logic_vector(7 downto 0); 
    		RESULT				: out std_logic_vector(7 downto 0);
                                   READY				: out std_logic
    	);
    end DIVIDER;
    
    architecture RTL of DIVIDER is
    
    	signal DIV_REG : std_logic_vector(15 downto 0);
    	signal CYCLE_COUNTER : std_logic_vector(3 downto 0);
    begin
    		
    	DIV_PROCESS: process(NUMERATOR,DENOMINATOR,DIV_REG,RESET,CLK)
    		begin
    			if RESET='0' then
    				DIV_REG<=(others=>'0');
    			elsif CLK'event and CLK='1' then
    				if CYCLE_COUNTER="1000" then
    					DIV_REG(7 downto 0)<=NUMERATOR;
    					DIV_REG(15 downto 8)<=(others=>'0');
    					RESULT<=DIV_REG(7 downto 0);
                    READY<='1';
    				else
                                                                                    READY<='0';
    					if DIV_REG(14 downto 7)>=DENOMINATOR then
    						DIV_REG(15 downto 8)<=DIV_REG(14 downto 7)-DENOMINATOR;
    						DIV_REG(7 downto 1)<=DIV_REG(6 downto 0);
    						DIV_REG(0)<='1';
    					else
    						DIV_REG(15 downto 1)<=DIV_REG(14 downto 0);
    						DIV_REG(0)<='0';
    					end if;
    				end if;
    			end if;
    		end process;		
    	
    	CYCLE_COUNTER_PROCESS: process(CLK,RESET,CYCLE_COUNTER)
    		begin
    			if RESET<='0' then
    				CYCLE_COUNTER<=(others=>'0');
    			elsif CLK'event and CLK='1' then
    				if CYCLE_COUNTER="1000" then
    					CYCLE_COUNTER<=(others=>'0');
    				else
    					CYCLE_COUNTER<=CYCLE_COUNTER+1;
    				end if;
    			end if;
    		end process;
    		
    end RTL;


    To moja propozycja ( rezultat bez reszty )
    Sprawdzzona - Działa

    Pozdrawiam
    Bartek
  • REKLAMA
  • #5 6206520
    mariusz102102
    Poziom 12  
    Posty: 67
    Pomógł: 2
    Przyklad ok. Mam kilka uwag kosmetycznych co do kodu:
    - w liscie czulosci wystarcza tylko CLK,RESET
    - signal DIV_REG uzywany jest tylko w jednym procesie. "Ladniej" (latwiej sie debug-uje, szybsza symulacja) zrobic z DIV_REG variable wewnatrz procesu DIV_PROCESS
    - fajnie byloby dodac parametryzacje na szerokosc danych wy/we, dokladnosc itp :)

    Pozdrawiam
    Mariusz
  • #6 6209477
    _greis_
    Poziom 14  
    Posty: 70
    Pomógł: 9
    Ocena: 1
    Takie pytanie mi się nasuwa po przeanalizowaniu twojego kodu:
    Skąd wiadomo kiedy będzie gotowy/poprawny wynik dzielenia gdy wpiszemy nowe dane wejściowe?
    przydałby się wejście zezwolenia i ready :D

    pzdr
  • #7 6211429
    bartekgajos
    Poziom 14  
    Posty: 73
    Pomógł: 5
    Ocena: 2
    Witam

    Może niezgrabnie, ale już mamy sygnał Ready.

    Pozdrawiam
    Bartek

Podsumowanie tematu

✨ Dyskusja dotyczy realizacji dzielenia liczb binarnych stałoprzecinkowych w VHDL. Wskazano, że istnieje wiele metod implementacji operacji arytmetycznych, które są szeroko opisane na stronach uczelnianych i w literaturze dotyczącej układów programowalnych. Zalecane jest wykorzystanie pakietu fixed_pkg, dostępnego w standardzie VHDL 2006, który oferuje parametryzację szerokości danych, dokładności obliczeń oraz sposobu zaokrąglania. Przykład kodu modułu dzielnika zawiera sygnały wejściowe i wyjściowe, zegar, reset oraz sygnał READY informujący o gotowości wyniku. Wskazano na konieczność optymalizacji listy czułości procesów, użycie zmiennych lokalnych zamiast sygnałów dla lepszej symulacji oraz dodanie parametryzacji szerokości danych. Poruszono także kwestię synchronizacji i sygnałów sterujących, takich jak wejście zezwolenia i sygnał READY, które informują o poprawności i gotowości wyniku dzielenia.
Wygenerowane przez model językowy.
REKLAMA