OpenCores
URL https://opencores.org/ocsvn/mkjpeg/mkjpeg/trunk

Subversion Repositories mkjpeg

[/] [mkjpeg/] [trunk/] [design/] [hostif/] [HostIF.vhd] - Blame information for rev 25

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 25 mikel262
-------------------------------------------------------------------------------
2
-- File Name : HostIF.vhd
3
--
4
-- Project   : JPEG_ENC
5
--
6
-- Module    : HostIF
7
--
8
-- Content   : Host Interface (Xilinx OPB v2.1)
9
--
10
-- Description : 
11
--
12
-- Spec.     : 
13
--
14
-- Author    : Michal Krepa
15
--
16
-------------------------------------------------------------------------------
17
-- History :
18
-- 20090301: (MK): Initial Creation.
19
-------------------------------------------------------------------------------
20
 
21
library ieee;
22
  use ieee.std_logic_1164.all;
23
  use ieee.numeric_std.all;
24
 
25
entity HostIF is
26
  port
27
  (
28
        CLK                : in  std_logic;
29
        RST                : in  std_logic;
30
        -- OPB
31
        OPB_ABus           : in  std_logic_vector(31 downto 0);
32
        OPB_BE             : in  std_logic_vector(3 downto 0);
33
        OPB_DBus_in        : in  std_logic_vector(31 downto 0);
34
        OPB_RNW            : in  std_logic;
35
        OPB_select         : in  std_logic;
36
        OPB_DBus_out       : out std_logic_vector(31 downto 0);
37
        OPB_XferAck        : out std_logic;
38
        OPB_retry          : out std_logic;
39
        OPB_toutSup        : out std_logic;
40
        OPB_errAck         : out std_logic;
41
 
42
        -- Quantizer RAM
43
        qdata              : out std_logic_vector(7 downto 0);
44
        qaddr              : out std_logic_vector(5 downto 0);
45
        qwren              : out std_logic;
46
 
47
        -- CTRL
48
        jpeg_ready         : in  std_logic;
49
        jpeg_busy          : in  std_logic;
50
 
51
        -- ByteStuffer
52
        outram_base_addr   : out std_logic_vector(9 downto 0);
53
        num_enc_bytes      : in  std_logic_vector(23 downto 0);
54
 
55
        -- others
56
        img_size_x         : out std_logic_vector(15 downto 0);
57
        img_size_y         : out std_logic_vector(15 downto 0);
58
        img_size_wr        : out std_logic;
59
        sof                : out std_logic;
60
        cmp_max            : out std_logic_vector(1 downto 0)
61
 
62
    );
63
end entity HostIF;
64
 
65
-------------------------------------------------------------------------------
66
-------------------------------------------------------------------------------
67
----------------------------------- ARCHITECTURE ------------------------------
68
-------------------------------------------------------------------------------
69
-------------------------------------------------------------------------------
70
architecture RTL of HostIF is
71
 
72
  constant C_ENC_START_REG        : std_logic_vector(31 downto 0) := X"0000_0000";
73
  constant C_IMAGE_SIZE_REG       : std_logic_vector(31 downto 0) := X"0000_0004";
74
  constant C_IMAGE_RAM_ACCESS_REG : std_logic_vector(31 downto 0) := X"0000_0008";
75
  constant C_ENC_STS_REG          : std_logic_vector(31 downto 0) := X"0000_000C";
76
  constant C_COD_DATA_ADDR_REG    : std_logic_vector(31 downto 0) := X"0000_0010";
77
  constant C_ENC_LENGTH_REG       : std_logic_vector(31 downto 0) := X"0000_0014";
78
  constant C_QUANTIZER_RAM        : std_logic_vector(31 downto 0) :=
79
                                      X"0000_01" & "------00";
80
  constant C_IMAGE_RAM            : std_logic_vector(31 downto 0) :=
81
                                      X"001" & "------------------00";
82
 
83
  constant C_IMAGE_RAM_BASE : unsigned(31 downto 0) := X"0010_0000";
84
 
85
  signal enc_start_reg            : std_logic_vector(31 downto 0);
86
  signal image_size_reg           : std_logic_vector(31 downto 0);
87
  signal image_ram_access_reg     : std_logic_vector(31 downto 0);
88
  signal enc_sts_reg              : std_logic_vector(31 downto 0);
89
  signal cod_data_addr_reg        : std_logic_vector(31 downto 0);
90
  signal enc_length_reg           : std_logic_vector(31 downto 0);
91
 
92
  signal rd_dval                  : std_logic;
93
  signal data_read                : std_logic_vector(31 downto 0);
94
  signal quantizer_ram_q          : std_logic_vector(31 downto 0);
95
  signal image_ram_q              : std_logic_vector(31 downto 0);
96
  signal write_done               : std_logic;
97
  signal OPB_select_d             : std_logic;
98
 
99
-------------------------------------------------------------------------------
100
-- Architecture: begin
101
-------------------------------------------------------------------------------
102
begin
103
 
104
  OPB_retry    <= '0';
105
  OPB_toutSup  <= '0';
106
  OPB_errAck   <= '0';
107
 
108
  -- temporary!!
109
  quantizer_ram_q <= (others => '0');
110
  image_ram_q     <= (others => '0');
111
 
112
  img_size_x <= image_size_reg(31 downto 16);
113
  img_size_y <= image_size_reg(15 downto 0);
114
 
115
  outram_base_addr <= cod_data_addr_reg(outram_base_addr'range);
116
 
117
  cmp_max <= enc_start_reg(2 downto 1);
118
 
119
  -------------------------------------------------------------------
120
  -- OPB read
121
  -------------------------------------------------------------------
122
  p_read : process(CLK, RST)
123
  begin
124
    if RST = '1' then
125
      OPB_DBus_out <= (others => '0');
126
      rd_dval      <= '0';
127
      data_read    <= (others => '0');
128
    elsif CLK'event and CLK = '1' then
129
      rd_dval <= '0';
130
 
131
      OPB_DBus_out <= data_read;
132
 
133
      if OPB_select = '1' and OPB_select_d = '0' then
134
        -- only double word transactions are be supported
135
        if OPB_RNW = '1' and OPB_BE = X"F" then
136
          case OPB_ABus is
137
            when C_ENC_START_REG =>
138
              data_read <= enc_start_reg;
139
              rd_dval <= '1';
140
 
141
            when C_IMAGE_SIZE_REG =>
142
              data_read <= image_size_reg;
143
              rd_dval <= '1';
144
 
145
            when C_IMAGE_RAM_ACCESS_REG =>
146
              data_read <= image_ram_access_reg;
147
              rd_dval <= '1';
148
 
149
            when C_ENC_STS_REG =>
150
              data_read <= enc_sts_reg;
151
              rd_dval <= '1';
152
 
153
            when C_COD_DATA_ADDR_REG =>
154
              data_read <= cod_data_addr_reg;
155
              rd_dval <= '1';
156
 
157
            when C_ENC_LENGTH_REG =>
158
              data_read <= enc_length_reg;
159
              rd_dval <= '1';
160
 
161
            when others =>
162
              data_read <= (others => '0');
163
          end case;
164
 
165
        end if;
166
      end if;
167
    end if;
168
  end process;
169
 
170
  -------------------------------------------------------------------
171
  -- OPB write
172
  -------------------------------------------------------------------
173
  p_write : process(CLK, RST)
174
  begin
175
    if RST = '1' then
176
      qwren                <= '0';
177
      write_done           <= '0';
178
      enc_start_reg        <= (others => '0');
179
      image_size_reg       <= (others => '0');
180
      image_ram_access_reg <= (others => '0');
181
      enc_sts_reg          <= (others => '0');
182
      cod_data_addr_reg    <= (others => '0');
183
      enc_length_reg       <= (others => '0');
184
      qdata                <= (others => '0');
185
      qaddr                <= (others => '0');
186
      OPB_select_d         <= '0';
187
      sof                  <= '0';
188
      img_size_wr          <= '0';
189
    elsif CLK'event and CLK = '1' then
190
      qwren        <= '0';
191
      write_done   <= '0';
192
      sof          <= '0';
193
      img_size_wr  <= '0';
194
      OPB_select_d <= OPB_select;
195
 
196
      if OPB_select = '1' and OPB_select_d = '0' then
197
        -- only double word transactions are be supported
198
        if OPB_RNW = '0' and OPB_BE = X"F" then
199
          case OPB_ABus is
200
            when C_ENC_START_REG =>
201
              enc_start_reg <= OPB_DBus_in;
202
              write_done <= '1';
203
              if OPB_DBus_in(0) = '1' then
204
                sof <= '1';
205
              end if;
206
 
207
            when C_IMAGE_SIZE_REG =>
208
              image_size_reg <= OPB_DBus_in;
209
              img_size_wr <= '1';
210
              write_done <= '1';
211
 
212
            when C_IMAGE_RAM_ACCESS_REG =>
213
              image_ram_access_reg <= OPB_DBus_in;
214
              write_done <= '1';
215
 
216
            when C_ENC_STS_REG =>
217
              enc_sts_reg <= (others => '0');
218
              write_done <= '1';
219
 
220
            when C_COD_DATA_ADDR_REG =>
221
              cod_data_addr_reg <= OPB_DBus_in;
222
              write_done <= '1';
223
 
224
            when C_ENC_LENGTH_REG =>
225
              --enc_length_reg <= OPB_DBus_in;
226
              write_done <= '1';
227
 
228
            when others =>
229
              null;
230
          end case;
231
 
232
          if std_match(OPB_ABus, C_QUANTIZER_RAM) then
233
            qdata      <= OPB_DBus_in(qdata'range);
234
            qaddr      <= OPB_ABus(qaddr'high+2 downto 2);
235
            qwren      <= '1';
236
            write_done <= '1';
237
          end if;
238
        end if;
239
      end if;
240
 
241
      -- special handling of status reg
242
      if jpeg_ready = '1' then
243
        -- set jpeg done flag
244
        enc_sts_reg(1) <= '1';
245
      end if;
246
      enc_sts_reg(0) <= jpeg_busy;
247
 
248
      enc_length_reg <= (others => '0');
249
      enc_length_reg(num_enc_bytes'range) <= num_enc_bytes;
250
 
251
    end if;
252
  end process;
253
 
254
  -------------------------------------------------------------------
255
  -- transfer ACK
256
  -------------------------------------------------------------------
257
  p_ack : process(CLK, RST)
258
  begin
259
    if RST = '1' then
260
      OPB_XferAck <= '0';
261
    elsif CLK'event and CLK = '1' then
262
      OPB_XferAck <= rd_dval or write_done;
263
    end if;
264
  end process;
265
 
266
 
267
end architecture RTL;
268
-------------------------------------------------------------------------------
269
-- Architecture: end
270
-------------------------------------------------------------------------------

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.