Niestety nie przeszedł projekt, bo gość chce by na 4 wyświetlaczach to chulało jak k=4, na 3 wyświetlaczach jak k=3 itp aby jednocześnie wyświetlało kombinację i nie chce by pamiętać wszystkich kombinacji, tylko aktualną sekwencję dzięki czemu nie przekroczy się dostępnej pamięci na płytce. I zmodyfikowałem kod odpowiednio i przeszedł wszystkie checksyntaxy itd.
Kod: Zaznacz cały
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity generator_komb is
generic(
n_calk: integer :=6;
k_calk: integer :=3
);
port(CLK: in std_logic;
START: in std_logic;
EOC: out std_logic :='0';
LED: out STD_LOGIC_VECTOR (6 downto 0);
wys_led: out STD_LOGIC_VECTOR(3 downto 0)
);
end generator_komb;
architecture Behavioral of generator_komb is
type tablica is array (1 to 15) of integer range 0 to 15;
signal present_state, next_state: integer range 0 to 5;
signal A, K: tablica;
signal ind, s, MAX: integer range 1 to 15;
signal nr_led: std_logic_vector (1 downto 0) :="00";
signal wysw: integer range 0 to 15;
signal czekaj: std_logic_vector(19 downto 0) :=X"00000";
signal sekunda: bit :='0';
begin
zegar: process(clk) is
begin
if((clk'event)and(clk='1'))then --jesli narastajace zbocze zegara
if(nr_led="11")then --jesli nr_led="11"
nr_led <= "00"; --to wyzeruj nr_led
else --w przeciwnym wypadku
nr_led <= nr_led + "01"; --zwiększ nr_led o 1;
end if;
if(czekaj=X"186A0")then --jesli sygnał czekaj=100000d
sekunda <= not sekunda; --zaneguj bit sekunda na przeciwny
czekaj <= X"00000"; --wyzeruj sygnał czekaj
else --jesli sygnał czekaj /= 100000d
czekaj <= czekaj + X"00001"; --zwieksz sygnal czekaj o 1d
end if;
end if;
end process zegar;
takt: process (next_state, sekunda) is
begin
if(sekunda='1')then
present_state <= next_state;
end if;
end process takt;
main: process(start, present_state)
variable i, ind_temp: integer range 1 to 15;
variable A_temp: tablica;
begin
if(start = '1')then
case present_state is
when 1 => ind <= 1; --ind=1
MAX <= n_calk-k_calk+1; --MAX=n-k+1
s <= 1; --s=1
next_state <= 2;
when 2 =>
for i in 1 to k_calk loop--ONE2SUBSET
A_temp(i) := s;
end loop;
A <= A_temp;
s <= A_temp(ind)+1; --s=2
next_state <= 3;
when 3 =>
for i in 1 to k_calk loop --OUTPUT
K(i) <= A(i)+i-1; --mamy 1 kombinację umieszczoną w tablicy
end loop;
ind <= k_calk; --ind=k
next_state <= 4;
when 4 =>
if(ind>0)then --while(ind>0)do
F0: for i in k_calk downto 1 loop --ONE2SUBSET
A_temp(i) := s;
exit F0 when (i<ind);
end loop F0;
A <= A_temp;
next_state <= 5;
else --while(!ind>0)do
EOC <= '1'; --EOC=1 - dioda informujaca, ze koniec generowania kombinacji
end if;
when 5 =>
for i in 1 to k_calk loop --OUTPUT
K(i) <= A(i)+i-1;
end loop;
if(A(ind)<MAX) then
s <= A(ind)+1;
ind <= k_calk;
else
ind_temp := ind-1;
ind <= ind_temp;
if(ind_temp/=0)then
s <= A(ind_temp)+1;
end if;
end if;
next_state <= 4;
when others => next_state <= 1; --kiedy nacisniemy przycisk startu automat stanu zaczyna swoją pracę
end case;
else -- jesli start=0;
next_state <= 0; --zresetuj automat stanu
EOC <= '0';
for i in 1 to 15 loop
K(i) <= 0;
end loop;
end if;
end process main;
--wybor wyswietlacz
with nr_led select
wys_led <= "1110" when "00",
"1101" when "01",
"1011" when "10",
"0111" when "11",
"1111" when others;
--wybor pozycji wektora K to wyswietlenia
with nr_led select
wysw <= K(1) when "00",
K(2) when "01",
K(3) when "10",
K(4) when "11",
0 when others;
--konwerter kodu
with wysw Select
LED <= "1111001" when 1, --1
"0100100" when 2, --2
"0110000" when 3, --3
"0011001" when 4, --4
"0010010" when 5, --5
"0000010" when 6, --6
"1111000" when 7, --7
"0000000" when 8, --8
"0010000" when 9, --9
"0001000" when 10, --A
"0000011" when 11, --b
"1000110" when 12, --C
"0100001" when 13, --d
"0000110" when 14, --E
"0001110" when 15, --F
"1111111" when others; --nic
end Behavioral;
I może bedzie działać, ale jeszcze gość chce by mu testbencha zrobić a tego to za chuja nie umię, bo jak utworze text bench waveform i potem daję na Simulate Behavioral Model to wypierdala takie błędy:
Running Fuse ...
WARNING:HDLParsers:3215 - Unit work/test is now defined in a different file: was G:/Xilinx/generator_kombinacji/test.ant, now is G:/Xilinx/generator_kombinacji/test.vhw
WARNING:HDLParsers:3215 - Unit work/test/testbench_arch is now defined in a different file: was G:/Xilinx/generator_kombinacji/test.ant, now is G:/Xilinx/generator_kombinacji/test.vhw
Compiling vhdl file "G:/Xilinx/generator_kombinacji/test.vhw" in Library work.
Entity <test> compiled.
Entity <test> (Architecture <testbench_arch>) compiled.
Parsing "test_beh.prj": 0.05
Codegen work/test: 0.00
ERROR:Simulator:418 - Compilation failed: g++.exe: Nie mo¿na odnale æ okre lonego pliku..
ERROR:Simulator:222 - Generated C++ compilation was unsuccessful
Codegen work/test/testbench_arch: 0.02