eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronika › VHDL - konwersja bin2bcd
Ilość wypowiedzi w tym wątku: 27

  • 1. Data: 2020-12-04 21:59:54
    Temat: VHDL - konwersja bin2bcd
    Od: Atlantis <m...@w...pl>

    W ramach poznawania podstaw VHDL-a na CPLD pracuję obecnie nad pewnym
    projektem. O ile bez większego problemu udało mi się napisać większość
    potrzebnych komponentów (dzielnik częstotliwości, licznik binarny,
    sterownik wyświetlacza siedmiosegmentowego).
    Niestety - wygląda na to, że utknąłem na zagadnieniu konwersji liczby
    zakodowanej binarnie na kod BCD. Na wejściu komponentu mam siedmiobitowy
    STD_LOGIC_VECTOR, przez ktory przekazuję wartość mieszczącą się między 0
    i 99. Na wyjściu znajduje się ośmiobitowy STD_LOGIC_VECTOR. Jego starszy
    półbajt ma mieścić liczbę dziesiątek, młodszy liczbę jedności.

    Wydawało mi się, że mogę to zrobić prosto, tak samo jak na
    mikrokontrolerach - dziesiątki uzyskując za pomocą dzielenia przez 10, a
    jednostki za sprawą operacji modulo 10.

    Napisałem więc coś następującego:

    bcdval(7 DOWNTO 4) <= binval/10;
    bcdval(7 DOWNTO 0) <= binval MOD 10;

    Niestety, synteza kodu wywala się właśnie w tym miejscu, zwracając błąd:
    "Operator <DIVIDE> must have constnt operands or first operand must be
    power of 2".

    Wygląda więc na to, że nie mogę w prosty sposób wykonać dzielenia
    dowolnej liczby przez inną dowolną liczbę.

    Jak w takim razie powinien być zrealizowany taki konwerter?


  • 2. Data: 2020-12-05 00:22:07
    Temat: Re: VHDL - konwersja bin2bcd
    Od: a...@m...uni.wroc.pl

    Atlantis <m...@w...pl> wrote:
    > W ramach poznawania podstaw VHDL-a na CPLD pracuj? obecnie nad pewnym
    > projektem.

    O VHDL nie ma pojecia wiec sie wypowiem :)

    > O ile bez wi?kszego problemu uda?o mi si? napisa? wi?kszo??
    > potrzebnych komponent?w (dzielnik cz?stotliwo?ci, licznik binarny,
    > sterownik wy?wietlacza siedmiosegmentowego).
    > Niestety - wygl?da na to, ?e utkn??em na zagadnieniu konwersji liczby
    > zakodowanej binarnie na kod BCD. Na wej?ciu komponentu mam siedmiobitowy
    > STD_LOGIC_VECTOR, przez ktory przekazuj? warto?? mieszcz?c? si? mi?dzy 0
    > i 99. Na wyj?ciu znajduje si? o?miobitowy STD_LOGIC_VECTOR. Jego starszy
    > p??bajt ma mie?ci? liczb? dziesi?tek, m?odszy liczb? jedno?ci.
    >
    > Wydawa?o mi si?, ?e mog? to zrobi? prosto, tak samo jak na
    > mikrokontrolerach - dziesi?tki uzyskuj?c za pomoc? dzielenia przez 10, a
    > jednostki za spraw? operacji modulo 10.

    No, wszytkie mikrokontolery ktore mam dzielenie robia programowo.
    W wiekszych mmozenie jest sprzetowe, w mniejszych nawet mnozenie
    jest programowe.

    > Napisa?em wi?c co? nast?puj?cego:
    >
    > bcdval(7 DOWNTO 4) <= binval/10;
    > bcdval(7 DOWNTO 0) <= binval MOD 10;
    >
    > Niestety, synteza kodu wywala si? w?a?nie w tym miejscu, zwracaj?c b??d:
    > "Operator <DIVIDE> must have constnt operands or first operand must be
    > power of 2".
    >
    > Wygl?da wi?c na to, ?e nie mog? w prosty spos?b wykona? dzielenia
    > dowolnej liczby przez inn? dowoln? liczb?.
    >
    > Jak w takim razie powinien by? zrealizowany taki konwerter?

    Zgaduje ze VHDL z tego kodu chce zrobic siec logiczna ktora
    w "jednym kroku" produkuje wynik. Wszystkie procesory ktore
    znam majace sprzetowe dzielenie maja dzielenie wielotaktowe.
    Ogolnie jednotaktowa siec dzielaca jest skomplikowan i duza.
    Ty masz bardzo maly rozmiar danych, wiec jak sie upierasz
    to pewnie mozesz to zrobic "na sile": dla kazdego bitu
    wyniku napisac formule boolowska dajaca wartosc tego bitu, tzn
    cos w stylu

    out0 <= in0 /* Latwe */
    out1 <= (
    /* in = 2 lub in = 3 lub in = 6 lub in = 7 */
    in1 and not in3 ... and not in7
    /* in = 12 lub in = 13 */
    or not in1 and in2 and in3 and not in4 ...
    ....

    Przetlumaczone naiwnie da pewnie kilka tysiecy bramek.
    Optymalizator moze to troche uproscic, ale nie liczylbym
    na dramatyczne uproszczenia.

    Rozsadniej zrobic wielotaktowa konwersje, tzn operacje "krok
    dzielenia". Dokladniej, na wejsciu kroku dzielenia masz
    dwie liczby 7-bitowe. Wyjscie to 1 bit wyniku dzielenia
    i liczba 7-bitowa (reszta z dzielenia). Ten bit wyniku
    to po prostu resultat porownania. Reszta to albo
    dzielna (jesli bit wyniku to 0) albo dzielna minus
    dzielnik (jesli bit wyniku to 1). Po kroku dzielnia
    oba argumenty dzielisz przez 2 (przesuwasz) i jesli
    trzeba robisz nastepny krok. W twoim przypadku
    krok dzielenia trzeba powtorzyc 4 razy. Teoretycznie
    mozesz po prostu uzyc kaskade 4 krokow, ale wtedy
    powielisz 4 razy glowna czesc.

    W twojej konwersji masz maly zakres i pewnie szybkosc
    jest malo istotna. W takim przypadku mozesz uzyc 3
    liczniki. Jeden zliczajacy az do argumetu. Drugi
    liczacy do 10 (daje reszte). Trzeci zliczajacy
    przeniesienia drugiego (daje wynik).

    Jesli w projekcie masz pamiec to chyba najrozsadniejsze
    jest przechowywanie tabeli konwersji w pamieci.

    Jeszcze jedno: bit 0 wyniku jest taki sam jak bit 0 wejscia,
    wiec problem redukuje sie do dzielnia liczby szesciobitowej
    przez 5. To pozwala na troche oszczednosci, ale nie
    zmienia zasady.

    --
    Waldek Hebisch


  • 3. Data: 2020-12-05 04:54:41
    Temat: Re: VHDL - konwersja bin2bcd
    Od: Stachu Chebel <s...@g...com>

    piątek, 4 grudnia 2020 o 22:00:03 UTC+1 Atlantis napisał(a):
    > W ramach poznawania podstaw VHDL-a na CPLD pracuję obecnie nad pewnym
    > projektem. O ile bez większego problemu udało mi się napisać większość
    > potrzebnych komponentów (dzielnik częstotliwości, licznik binarny,
    > sterownik wyświetlacza siedmiosegmentowego).
    > Niestety - wygląda na to, że utknąłem na zagadnieniu konwersji liczby
    > zakodowanej binarnie na kod BCD. Na wejściu komponentu mam siedmiobitowy
    > STD_LOGIC_VECTOR, przez ktory przekazuję wartość mieszczącą się między 0
    > i 99. Na wyjściu znajduje się ośmiobitowy STD_LOGIC_VECTOR. Jego starszy
    > półbajt ma mieścić liczbę dziesiątek, młodszy liczbę jedności.
    >
    > Wydawało mi się, że mogę to zrobić prosto, tak samo jak na
    > mikrokontrolerach - dziesiątki uzyskując za pomocą dzielenia przez 10, a
    > jednostki za sprawą operacji modulo 10.
    >
    > Napisałem więc coś następującego:
    >
    > bcdval(7 DOWNTO 4) <= binval/10;
    > bcdval(7 DOWNTO 0) <= binval MOD 10;
    >
    > Niestety, synteza kodu wywala się właśnie w tym miejscu, zwracając błąd:
    > "Operator <DIVIDE> must have constnt operands or first operand must be
    > power of 2".
    >
    > Wygląda więc na to, że nie mogę w prosty sposób wykonać dzielenia
    > dowolnej liczby przez inną dowolną liczbę.
    >
    > Jak w takim razie powinien być zrealizowany taki konwerter?

    Nie ma się co dziwić że wywala błąd. Przy VHDL'u musisz myśleć "sprzętowo" a nie
    "programowo".
    Można co prawda zdefiniować moduł dzielenia, ale jest przy tym trochę zabawy.
    Tymczasem
    w sieci jest od cholery gotowych źródeł. Wpisz w szukarce : vhdl binary to bcd.
    Można jeszcze inaczej. Ja bym zamiast CPLD zastosował FPGA. Cena najmniej zasobnych
    FPGA
    jest w zasadzie taka sama jak CPLD, a możliwości i zasoby o wiele większe. Wystarczy
    że zdefiniujesz
    sobie w FPGA 256-bajtowy ROM lub RAM, wpiszesz tabelkę konwersji i po ptokach.


  • 4. Data: 2020-12-05 20:47:13
    Temat: Re: VHDL - konwersja bin2bcd
    Od: Atlantis <m...@w...pl>

    On 05.12.2020 04:54, Stachu Chebel wrote:

    > Tymczasem w sieci jest od cholery gotowych źródeł. Wpisz w szukarce :
    > vhdl binary to bcd.

    Ok, wielkie dzięki. Udało mi się znaleźć działający kod modułu do
    konwersji BIN-BCD.


    > Można jeszcze inaczej. Ja bym zamiast CPLD zastosował FPGA. Cena
    > najmniej zasobnych FPGA jest w zasadzie taka sama jak CPLD, a
    > możliwości i zasoby o wiele większe. Wystarczy że zdefiniujesz sobie
    > w FPGA 256-bajtowy ROM lub RAM, wpiszesz tabelkę konwersji i po
    > ptokach.

    Postawiłem na CPLD z dwóch powodów:
    1. FPGA przeważnie wymagają zewnętrznej pamięci do przechowywania
    konfiguracji. CPLD mają wbudowany flash i można je zaprogramować tak
    samo, jak zwykły mikrokontroler.
    2. Zwykle staram się dopasować użyty układ do planowanego stopnia
    złożoności projektu. Czyli np. nie będę używał STM32F4 tam, gdzie
    potrzeba po parę kB flasha i RAM-u.

    Ale tak z ciekawości: jak złożone projekty można wepchnąć do tych
    najprostszych FPGA, w porównaniu do CPLD takiego jak CoolRunner II? Czy
    można już myśleć o dodaniu jakiegoś prostego mikroprocesora, który
    współpracowałby z pozostałymi peryferiami zaprogramowanymi w układzie?



  • 5. Data: 2020-12-05 22:09:11
    Temat: Re: VHDL - konwersja bin2bcd
    Od: "Grzegorz Niemirowski" <g...@g...net>

    a...@m...uni.wroc.pl <a...@m...uni.wroc.pl> napisał(a):
    >> O ile bez wi?kszego problemu uda?o mi si? napisa? wi?kszo??
    >> potrzebnych komponent?w (dzielnik cz?stotliwo?ci, licznik binarny,
    >> sterownik wy?wietlacza siedmiosegmentowego).

    Napraw w końcu te polskie litery.

    --
    Grzegorz Niemirowski
    https://www.grzegorz.net/


  • 6. Data: 2020-12-06 00:42:31
    Temat: Re: VHDL - konwersja bin2bcd
    Od: Grzegorz Kurczyk <g...@c...usun.slupsk.pl>

    W dniu 04.12.2020 o 21:59, Atlantis pisze:
    > W ramach poznawania podstaw VHDL-a na CPLD pracuję obecnie nad pewnym
    > projektem. O ile bez większego problemu udało mi się napisać większość
    > potrzebnych komponentów (dzielnik częstotliwości, licznik binarny,
    > sterownik wyświetlacza siedmiosegmentowego).
    > Niestety - wygląda na to, że utknąłem na zagadnieniu konwersji liczby
    > zakodowanej binarnie na kod BCD. Na wejściu komponentu mam siedmiobitowy
    > STD_LOGIC_VECTOR, przez ktory przekazuję wartość mieszczącą się między 0
    > i 99. Na wyjściu znajduje się ośmiobitowy STD_LOGIC_VECTOR. Jego starszy
    > półbajt ma mieścić liczbę dziesiątek, młodszy liczbę jedności.
    >
    > Wydawało mi się, że mogę to zrobić prosto, tak samo jak na
    > mikrokontrolerach - dziesiątki uzyskując za pomocą dzielenia przez 10, a
    > jednostki za sprawą operacji modulo 10.
    >
    > Napisałem więc coś następującego:
    >
    > bcdval(7 DOWNTO 4) <= binval/10;
    > bcdval(7 DOWNTO 0) <= binval MOD 10;
    >
    > Niestety, synteza kodu wywala się właśnie w tym miejscu, zwracając błąd:
    > "Operator <DIVIDE> must have constnt operands or first operand must be
    > power of 2".
    >
    > Wygląda więc na to, że nie mogę w prosty sposób wykonać dzielenia
    > dowolnej liczby przez inną dowolną liczbę.
    >

    VHDL (i Verilog) to nie języki programowania tylko języki opisu sprzętu.
    Musisz przestawić swój tok myslenia, co nie jest łatwe.
    Głównie "rzeźbię" w Verilogu, którego składnia bardzo przypomina język
    programowania C. Potrzebowałem trochę czasu aby przekonać zwoje mózgowe,
    że to co widzę na ekranie, to nie kolejno wykonywane linie programu
    tylko zbieranina połączonych ze sobą bramek i przerzutników.

    Wracając do Twojego problemu, to VHDL nie będzie próbował wykonać
    dzielenia, tylko będzie próbował zsyntezować na zasobach CPLD układ
    kombinacyjny realizujący zadaną funkcję dzielenia.
    Dzielenie liczby przez stałą nie będącą wielokrotnością potęgi 2 będzie
    wymagać na tyle dużo zasobów, że przekracza to możliwości typowego CPLD.

    Mnożenie i dzielenie przez stałą będącą wielokrotnością potęgi dwójki
    nie wymaga praktycznie żadnych zasobów sprzętowych. To tylko kabelki :-)

    Ale możesz wykorzystać rozdzielność dzielenia względem odejmowania.
    Poszukaj algorytmów dzielenia na procesory typu Z80, 6502 itp.



    --
    Pozdrawiam
    Grzegorz


  • 7. Data: 2020-12-07 02:48:00
    Temat: Re: VHDL - konwersja bin2bcd
    Od: Stachu Chebel <s...@g...com>

    sobota, 5 grudnia 2020 o 20:47:15 UTC+1 Atlantis napisał(a):

    > Postawiłem na CPLD z dwóch powodów:
    > 1. FPGA przeważnie wymagają zewnętrznej pamięci do przechowywania
    > konfiguracji. CPLD mają wbudowany flash i można je zaprogramować tak
    > samo, jak zwykły mikrokontroler.

    Ośmiopinowy flash za jakieś 5 zeta to chyba nie problem. A programujesz
    JTAG'iem podobnie jak cokolwiek innego.

    > 2. Zwykle staram się dopasować użyty układ do planowanego stopnia
    > złożoności projektu. Czyli np. nie będę używał STM32F4 tam, gdzie
    > potrzeba po parę kB flasha i RAM-u.
    >

    Niby racja, ale skoro możesz dostać więcej za tę samą cenę, to ja obstawiam
    na FPGA.

    > Ale tak z ciekawości: jak złożone projekty można wepchnąć do tych
    > najprostszych FPGA, w porównaniu do CPLD takiego jak CoolRunner II? Czy
    > można już myśleć o dodaniu jakiegoś prostego mikroprocesora, który
    > współpracowałby z pozostałymi peryferiami zaprogramowanymi w układzie?

    Nawet nie ma co porównywać. Przepuść sobie implementację tego co masz
    zrobione na CPLD z ustawieniem na najprostszego Spartana-3 i popatrz na
    raport wykorzystania zasobów. Nie ma najmniejszego problemu jeśli chodzi
    o zaimplementowanie procesora w FPGA. Oczywiście wszystko zależy od
    stopnia złożoności projektu i wybranego modelu FPGA. Są dostępne w sieci
    darmowe IP na 8080,Z80,8051 itp. Ponadto na pokładzie FPGA masz też
    konfigurowalną pamięć BRAM. Dużo się da...


  • 8. Data: 2020-12-07 10:04:20
    Temat: Re: VHDL - konwersja bin2bcd
    Od: Grzegorz Kurczyk <g...@c...usun.slupsk.pl>

    W dniu 04.12.2020 o 21:59, Atlantis pisze:
    > W ramach poznawania podstaw VHDL-a na CPLD pracuję obecnie nad pewnym
    > projektem. O ile bez większego problemu udało mi się napisać większość
    > potrzebnych komponentów (dzielnik częstotliwości, licznik binarny,
    > sterownik wyświetlacza siedmiosegmentowego).
    > Niestety - wygląda na to, że utknąłem na zagadnieniu konwersji liczby
    > zakodowanej binarnie na kod BCD. Na wejściu komponentu mam siedmiobitowy
    > STD_LOGIC_VECTOR, przez ktory przekazuję wartość mieszczącą się między 0
    > i 99. Na wyjściu znajduje się ośmiobitowy STD_LOGIC_VECTOR. Jego starszy
    > półbajt ma mieścić liczbę dziesiątek, młodszy liczbę jedności.
    >
    > Wydawało mi się, że mogę to zrobić prosto, tak samo jak na
    > mikrokontrolerach - dziesiątki uzyskując za pomocą dzielenia przez 10, a
    > jednostki za sprawą operacji modulo 10.
    >
    > Napisałem więc coś następującego:
    >
    > bcdval(7 DOWNTO 4) <= binval/10;
    > bcdval(7 DOWNTO 0) <= binval MOD 10;
    >
    > Niestety, synteza kodu wywala się właśnie w tym miejscu, zwracając błąd:
    > "Operator <DIVIDE> must have constnt operands or first operand must be
    > power of 2".
    >
    > Wygląda więc na to, że nie mogę w prosty sposób wykonać dzielenia
    > dowolnej liczby przez inną dowolną liczbę.
    >
    > Jak w takim razie powinien być zrealizowany taki konwerter?


    P.S. A może zamiast licznika binarnego zakoduj licznik BCD.
    Coś na wzór UCY7490 :-)

    --
    Pozdrawiam
    Grzegorz


  • 9. Data: 2020-12-07 10:08:51
    Temat: Re: VHDL - konwersja bin2bcd
    Od: Grzegorz Kurczyk <g...@c...usun.slupsk.pl>

    W dniu 07.12.2020 o 10:04, Grzegorz Kurczyk pisze:
    >
    > P.S. A może zamiast licznika binarnego zakoduj licznik BCD.
    > Coś na wzór UCY7490 :-)
    >

    lub raczej na wzór synchronicznego licznika UCY74192.
    Na wyjściu będziesz miał gotowe dane do sterowania dekodera wyświetlacza
    7-segmentowego.


    --
    Pozdrawiam
    Grzegorz


  • 10. Data: 2020-12-07 13:26:36
    Temat: Re: VHDL - konwersja bin2bcd
    Od: Adam Górski <gorskiamalpawpkropkapl@xx>

    W dniu 04/12/2020 o 21:59, Atlantis pisze:
    > W ramach poznawania podstaw VHDL-a na CPLD pracuję obecnie nad pewnym
    > projektem. O ile bez większego problemu udało mi się napisać większość
    > potrzebnych komponentów (dzielnik częstotliwości, licznik binarny,
    > sterownik wyświetlacza siedmiosegmentowego).
    > Niestety - wygląda na to, że utknąłem na zagadnieniu konwersji liczby
    > zakodowanej binarnie na kod BCD. Na wejściu komponentu mam siedmiobitowy
    > STD_LOGIC_VECTOR, przez ktory przekazuję wartość mieszczącą się między 0
    > i 99. Na wyjściu znajduje się ośmiobitowy STD_LOGIC_VECTOR. Jego starszy
    > półbajt ma mieścić liczbę dziesiątek, młodszy liczbę jedności.
    >
    > Wydawało mi się, że mogę to zrobić prosto, tak samo jak na
    > mikrokontrolerach - dziesiątki uzyskując za pomocą dzielenia przez 10, a
    > jednostki za sprawą operacji modulo 10.
    >
    > Napisałem więc coś następującego:
    >
    > bcdval(7 DOWNTO 4) <= binval/10;
    > bcdval(7 DOWNTO 0) <= binval MOD 10;
    >
    > Niestety, synteza kodu wywala się właśnie w tym miejscu, zwracając błąd:
    > "Operator <DIVIDE> must have constnt operands or first operand must be
    > power of 2".
    >
    > Wygląda więc na to, że nie mogę w prosty sposób wykonać dzielenia
    > dowolnej liczby przez inną dowolną liczbę.
    >
    > Jak w takim razie powinien być zrealizowany taki konwerter?

    https://www.digikey.com/eewiki/pages/viewpage.action
    ?pageId=60030986

    Pozdrawiam

    Adam Górski

strony : [ 1 ] . 2 . 3


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: