Problem jest w zasadzie rozwinięciem poprzedniego wątkaDo rzeczy, układ ma obliczać coś takiego: C=|R(0)+...+R(15)-R(16)-....-R(31)|, gdzie C,R(i)-liczby 11 bitowe bez znaku. R(i) są to kolejne sekcje rejestru posuwnego, w którym na pierwszą sekcję jest podawana 11 bitowa liczba "A" (bez znaku). Układ działa poprawnie zarówno na symulatorze jak i na żywym organiźmie. Wszystkie operacje +/- zrobiłem krok po kroku. A co gdybym miał pierdyljon sekcji rejestru posuwnego? Jak to zwięźlej zapisać? Kod wygląda tak:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; library UNISIM; use UNISIM.VComponents.all;
entity amod is
Port ( A : in STD_LOGIC_VECTOR (10 downto 0); CLK : in STD_LOGIC; C : out STD_LOGIC_VECTOR (10 downto 0)); end amod;
architecture Behavioral of amod is type Shift_Register_Type is array (31 downto 0) of std_logic_vector(10 downto 0); signal Cs:std_logic_vector(14 downto 0):="000000000000000"; signal Rejestr:Shift_Register_Type; begin
process(CLK) begin if rising_edge(CLK) then Rejestr<=Rejestr(30 downto 0)&A; Cs<=std_logic_vector(to_unsigned(abs(to_integer(signed('0'&Rejestr(0)))+ to_integer(signed('0'&Rejestr(1)))+ to_integer(signed('0'&Rejestr(2)))+ to_integer(signed('0'&Rejestr(3)))+ to_integer(signed('0'&Rejestr(4)))+ to_integer(signed('0'&Rejestr(5)))+ to_integer(signed('0'&Rejestr(6)))+ to_integer(signed('0'&Rejestr(7)))+ to_integer(signed('0'&Rejestr(8)))+ to_integer(signed('0'&Rejestr(9)))+ to_integer(signed('0'&Rejestr(10)))+ to_integer(signed('0'&Rejestr(11)))+ to_integer(signed('0'&Rejestr(12)))+ to_integer(signed('0'&Rejestr(13)))+ to_integer(signed('0'&Rejestr(14)))+ to_integer(signed('0'&Rejestr(15)))- to_integer(signed('0'&Rejestr(16)))- to_integer(signed('0'&Rejestr(17)))- to_integer(signed('0'&Rejestr(18)))- to_integer(signed('0'&Rejestr(19)))- to_integer(signed('0'&Rejestr(20)))- to_integer(signed('0'&Rejestr(21)))- to_integer(signed('0'&Rejestr(22)))- to_integer(signed('0'&Rejestr(23)))- to_integer(signed('0'&Rejestr(24)))- to_integer(signed('0'&Rejestr(25)))- to_integer(signed('0'&Rejestr(26)))- to_integer(signed('0'&Rejestr(27)))- to_integer(signed('0'&Rejestr(28)))- to_integer(signed('0'&Rejestr(29)))- to_integer(signed('0'&Rejestr(30)))- to_integer(signed('0'&Rejestr(31)))),15)); end if; end process; C<=Cs(14 downto 4); end Behavioral;