This repository has been archived by the owner on Jan 12, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfpga_inst.vhd
144 lines (127 loc) · 4.35 KB
/
fpga_inst.vhd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
-- Top-Module IVH projektu 2023
-- @author Onegen Something <xkrame00@vutbr.cz>
-- @date 2023-05-03
--
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library work;
use work.effects_pack.all;
architecture behavioral of tlv_gp_ifc is
-- @constant {INTEGER} SPEED
-- Dlzka periody medzi krokmi animacie (2^SPEED = pocet hodinovych cyklov medzi krokmi)
constant SPEED : integer := 22; -- pre beh
--constant SPEED : integer := 5; -- pre simulaciu
-- Rozmery maticoveho displeja.
constant WIDTH : positive := 16;
constant HEIGHT : positive := 8;
-- Stavy displeja
signal STAT_INIT : MATRIX_T := (others => (others => '0')); -- Pociatocny stav displeja
signal STAT_COL : MATRIX_T; -- Stavy stlpcov
signal NEIGH_L : MATRIX_T; -- Lave susedne stlpce
signal NEIGH_R : MATRIX_T; -- Prave susedne stlpce
-- Ovladanie stlpcov
signal CLK_ANIM : std_logic := '0'; -- Hodiny pre ovladanie animacie
signal COL_EN : std_logic := '0'; -- Povolovaci signal stlpcov
signal COL_RST : std_logic := '0'; -- Reset stplcov na INIT_STATE
signal DIRECTION : DIRECTION_T; -- Smer animacie
-- Ovladanie maticoveho displeja
signal CLK_REFR : std_logic := '0'; -- Spomalene hodiny pre obnovu displeja
signal A : std_logic_vector(3 downto 0) := "0000"; -- Adresa stlpca
signal R : std_logic_vector(HEIGHT - 1 downto 0) := "00000000"; -- Stav stlpca
-- ROM
signal ROM_IDX : natural := 0; -- Index obrazka v ROM
signal ROM_ADDR : std_logic_vector(1 downto 0) := "00"; -- Adresa ROM
signal ROM_OUT : std_logic_vector(WIDTH * HEIGHT - 1 downto 0); -- Vystup z ROM
begin
-- -----------------------
-- Citace
-- -----------------------
counters : entity work.counter
generic map(
OUT1_PERIOD => 2, -- Pre prepinanie stplcov
OUT2_PERIOD => 2 ** SPEED -- Pre koordinaciu animacie
)
port map(
CLK => CLK,
RESET => RESET,
EN1 => CLK_REFR,
EN2 => CLK_ANIM
);
-- -----------------------
-- Stavovy automat
-- -----------------------
fsm : entity work.fsm
port map(
CLK => CLK_ANIM,
EN => '1',
RST => '0',
COL_EN => COL_EN,
COL_RST => COL_RST,
DIRECTION => DIRECTION,
IMAGE_IDX => ROM_IDX
);
-- -----------------------
-- ROM
-- -----------------------
rom : entity work.rom
port map(
ADDR => ROM_ADDR,
DATA => ROM_OUT
);
ROM_ADDR <= std_logic_vector(to_unsigned(ROM_IDX, ROM_ADDR'length));
-- -----------------------
-- Stlpce
-- -----------------------
COLUMN_MAP : for i in 0 to WIDTH - 1 generate
subtype COLIDX_T is integer range 0 to WIDTH - 1;
constant COLIDX : COLIDX_T := COLIDX_T(i);
constant COLIDX_L : COLIDX_T := COLIDX_T((COLIDX - 1) mod WIDTH);
constant COLIDX_R : COLIDX_T := COLIDX_T((COLIDX + 1) mod WIDTH);
signal COL_NOW : std_logic_vector(HEIGHT - 1 downto 0); -- vhdl-linter-disable-line unused
begin
STAT_INIT(COLIDX) <= GETCOLUMN(ROM_OUT, COLIDX, HEIGHT);
column_inst : entity work.column
generic map(
N => HEIGHT
)
port map(
CLK => CLK_ANIM,
RESET => COL_RST,
STATE => COL_NOW,
INIT_STATE => STAT_INIT(COLIDX),
NEIGH_LEFT => NEIGH_L(COLIDX),
NEIGH_RIGHT => NEIGH_R(COLIDX),
DIRECTION => DIRECTION,
EN => COL_EN
);
STAT_COL(COLIDX) <= COL_NOW;
NEIGH_L(COLIDX_R) <= COL_NOW;
NEIGH_R(COLIDX_L) <= COL_NOW;
end generate;
-- -----------------------
-- Ovladanie displeja
-- -----------------------
R <= STAT_COL(to_integer(unsigned(A)));
-- Prepinanie stlpcov
p_addr : process (CLK_REFR)
begin
if rising_edge(CLK_REFR) then
A <= std_logic_vector(unsigned(A) + 1);
end if;
end process;
-- Mapovanie vystupu
X(6) <= A(3);
X(8) <= A(1);
X(10) <= A(0);
X(7) <= '0'; -- en_n
X(9) <= A(2);
X(16) <= R(1);
X(18) <= R(0);
X(20) <= R(7);
X(22) <= R(2);
X(17) <= R(4);
X(19) <= R(3);
X(21) <= R(6);
X(23) <= R(5);
end behavioral;