Witam wszystkich!!!
Ten post będzie się składał z dwóch części:
Pierwsza część postu
-------------------------------------------------------------------------------
1) Musze zrobić blok do mojego projektu lecz stanąłem w martwym punkcie. Konkretnie zatrzymałem się na bloku ALU który będzie odpowiadał za mnożenie dzielenie... musi się w nim dokonywać takie działanie C = A / (1,1 *B) lub C = (10*A) / (11*B). Kiedy biorę sprawdzanie kodu jest wszystko ok lecz później jest problem jak chce cały kod wrzucić w Spartana... Jest taki komunikat zwrotny:
"Analyzing Entity <test> in library <work> (Architecture <behavioral>).
ERROR:Xst:769 - "D:/Bibloteki/MATH/test.vhd" line 26: Operator <DIVIDE> must have constant operands or first operand must be power of 2"
I nie wiem za nic w świecie co robić.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--use IEEE.MATH_REAL.ALL;
entity test is
Port ( we : in std_logic;
C : out std_logic_vector(128 downto 0);-- 128 to wartość z palca wysłana no bie wiem jakiej długości się na razie tu spodziewać jest to w fazie testu
B : in std_logic_vector(19 downto 0)
);
end test;
architecture Behavioral of test is
signal A: integer;
signal temp1: integer;
signal stala1 : integer :=2;
signal stala2 : integer :=100000000;
signal stala3 : integer :=10;
signal stala4 : integer :=11;
begin
A <= (conv_integer(we)* stala1)/stala2;
temp1 <= ( stala3 * A ) / ( stala4 * conv_integer(B));
C <= conv_std_logic_vector(temp1, 128);
end Behavioral;
Ok krótki komentarz do kodu. Stale powprowadzałem większe 10 razy aby nie używac wartości real. Po prostu zamiast dawać 1,1 dałem 11 a A zwiększyłem 10 razy niby nic a pozbyłem się real... co co go używać jak zajmuje zbyt dużo zasobów układu...ale to na nawiasie
Co mam z tym fantem zrobić...
Druga część postu
-------------------------------------------------------------------------
2) Jak zamienić cały ciąg bitów po wyliczeniu C na wartość na wyświetlaczu. Moja propozycja jest na razie taka...
Wynik będzie porównywany z tablicą (dekoder) którą napiszę a będzie to wyglądała mniej więcej tak
Przykład
Wartość C po obliczeniu w powyższym bloku będzie równa 101010000011110011101010110 skok do dekodera który sprawdzi mi jakiej wartości odpowiada... w tym przypadku załóżmy ze będzie to 400,000 [jednostka] ... Dokonał bym tego po przez sklejenie bo na płycie S3E (500) jest LCD i sprawdziłem jakim wartościom w tablicy odpowiadają liczby 0 do 9. Mam przed sobą specyfikacji LCD jest to "0011"MSB sklejenie & a reszta do 0000 do 1001 LSB i tak bym miał cyfry od zera do dziewięciu.
Przecinek lub kropkę zapisać jako pełne słowo czyli 00101100 albo też przez sklejenie, aby unikać długiego klepania w klawiaturę
Następny krok to dekoder
000000000000000000000000000=>LCD<=S0,S0,S0,Sp,(Sk),S0,S0,S0;---000,000
.
.
.
101010000011110011101010110 =>LCD<= S4,S0,S0,Sp,(Sk),S0,S0,S0;--- 400,000
.
.
.
gdzie
S0 :=0000;--0
S1 :=0001;--1
.
.
.
S0 :=1001;--9
Sp :="00101100"--przecinek
Sk :="00101110" -- kropka
Pierwsze pytanie do drugiej części
Czy mój pomysł ma sens??
Jak nie to jak by to można inaczej zrobić ???
Drugie....
Generując tak długi wektor nie ma jakiegoś patentu aby sam mi wypisał wszystkie kombinacja... a resztę mu sam dopisze tą z S???
Pozdrawiam
lss
Ten post będzie się składał z dwóch części:
Pierwsza część postu
-------------------------------------------------------------------------------
1) Musze zrobić blok do mojego projektu lecz stanąłem w martwym punkcie. Konkretnie zatrzymałem się na bloku ALU który będzie odpowiadał za mnożenie dzielenie... musi się w nim dokonywać takie działanie C = A / (1,1 *B) lub C = (10*A) / (11*B). Kiedy biorę sprawdzanie kodu jest wszystko ok lecz później jest problem jak chce cały kod wrzucić w Spartana... Jest taki komunikat zwrotny:
"Analyzing Entity <test> in library <work> (Architecture <behavioral>).
ERROR:Xst:769 - "D:/Bibloteki/MATH/test.vhd" line 26: Operator <DIVIDE> must have constant operands or first operand must be power of 2"
I nie wiem za nic w świecie co robić.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
--use IEEE.MATH_REAL.ALL;
entity test is
Port ( we : in std_logic;
C : out std_logic_vector(128 downto 0);-- 128 to wartość z palca wysłana no bie wiem jakiej długości się na razie tu spodziewać jest to w fazie testu
B : in std_logic_vector(19 downto 0)
);
end test;
architecture Behavioral of test is
signal A: integer;
signal temp1: integer;
signal stala1 : integer :=2;
signal stala2 : integer :=100000000;
signal stala3 : integer :=10;
signal stala4 : integer :=11;
begin
A <= (conv_integer(we)* stala1)/stala2;
temp1 <= ( stala3 * A ) / ( stala4 * conv_integer(B));
C <= conv_std_logic_vector(temp1, 128);
end Behavioral;
Ok krótki komentarz do kodu. Stale powprowadzałem większe 10 razy aby nie używac wartości real. Po prostu zamiast dawać 1,1 dałem 11 a A zwiększyłem 10 razy niby nic a pozbyłem się real... co co go używać jak zajmuje zbyt dużo zasobów układu...ale to na nawiasie
Co mam z tym fantem zrobić...
Druga część postu
-------------------------------------------------------------------------
2) Jak zamienić cały ciąg bitów po wyliczeniu C na wartość na wyświetlaczu. Moja propozycja jest na razie taka...
Wynik będzie porównywany z tablicą (dekoder) którą napiszę a będzie to wyglądała mniej więcej tak
Przykład
Wartość C po obliczeniu w powyższym bloku będzie równa 101010000011110011101010110 skok do dekodera który sprawdzi mi jakiej wartości odpowiada... w tym przypadku załóżmy ze będzie to 400,000 [jednostka] ... Dokonał bym tego po przez sklejenie bo na płycie S3E (500) jest LCD i sprawdziłem jakim wartościom w tablicy odpowiadają liczby 0 do 9. Mam przed sobą specyfikacji LCD jest to "0011"MSB sklejenie & a reszta do 0000 do 1001 LSB i tak bym miał cyfry od zera do dziewięciu.
Przecinek lub kropkę zapisać jako pełne słowo czyli 00101100 albo też przez sklejenie, aby unikać długiego klepania w klawiaturę
Następny krok to dekoder
000000000000000000000000000=>LCD<=S0,S0,S0,Sp,(Sk),S0,S0,S0;---000,000
.
.
.
101010000011110011101010110 =>LCD<= S4,S0,S0,Sp,(Sk),S0,S0,S0;--- 400,000
.
.
.
gdzie
S0 :=0000;--0
S1 :=0001;--1
.
.
.
S0 :=1001;--9
Sp :="00101100"--przecinek
Sk :="00101110" -- kropka
Pierwsze pytanie do drugiej części
Czy mój pomysł ma sens??
Jak nie to jak by to można inaczej zrobić ???
Drugie....
Generując tak długi wektor nie ma jakiegoś patentu aby sam mi wypisał wszystkie kombinacja... a resztę mu sam dopisze tą z S???
Pozdrawiam
lss