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

Subversion Repositories heap_sorter

[/] [heap_sorter/] [trunk/] [high_speed_pipelined_4clk_per_word/] [src/] [sort_dpram.vhd] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 wzab
-------------------------------------------------------------------------------
2
-- Title      : Parametrized DP RAM for heap-sorter
3
-- Project    : heap-sorter
4
-------------------------------------------------------------------------------
5
-- File       : sort_dpram.vhd
6
-- Author     : Wojciech M. Zabolotny <wzab@ise.pw.edu.pl>
7
-- Company    : 
8
-- Created    : 2010-05-14
9
-- Last update: 2018-03-11
10
-- Platform   : 
11
-- Standard   : VHDL'93
12
-------------------------------------------------------------------------------
13
-- Description: 
14
-------------------------------------------------------------------------------
15
-- Copyright (c) 2010 Wojciech M. Zabolotny
16
-- This file is published under the BSD license, so you can freely adapt
17
-- it for your own purposes.
18
-- Additionally this design has been described in my article:
19
--    Wojciech M. Zabolotny, "Dual port memory based Heapsort implementation
20
--    for FPGA", Proc. SPIE 8008, 80080E (2011); doi:10.1117/12.905281
21
-- I'd be glad if you cite this article when you publish something based
22
-- on my design.
23
-------------------------------------------------------------------------------
24
-- Revisions  :
25
-- Date        Version  Author  Description
26
-- 2010-05-14  1.0      wzab    Created
27
-------------------------------------------------------------------------------
28
 
29
library ieee;
30
use ieee.std_logic_1164.all;
31
use ieee.numeric_std.all;
32
use ieee.std_logic_textio.all;
33
use std.textio.all;
34
library work;
35
use work.sorter_pkg.all;
36
use work.sys_config.all;
37
 
38
entity sort_dp_ram is
39
 
40
  generic
41
    (
42
      ADDR_WIDTH  : natural;
43
      NLEVELS     : natural;
44
      NAME        : string := "X";
45
      RAM_STYLE_G : string := "block"
46
      );
47
 
48
  port
49
    (
50
      clk    : in  std_logic;
51
      addr_a : in  std_logic_vector(NLEVELS-1 downto 0);
52
      addr_b : in  std_logic_vector(NLEVELS-1 downto 0);
53
      data_a : in  T_DATA_REC;
54
      data_b : in  T_DATA_REC;
55
      we_a   : in  std_logic;
56
      we_b   : in  std_logic;
57
      q_a    : out T_DATA_REC;
58
      q_b    : out T_DATA_REC
59
      );
60
 
61
end sort_dp_ram;
62
 
63
architecture rtl of sort_dp_ram is
64
 
65
  constant SYNC_CLK2 : boolean := false;
66
 
67
  signal vq_a, vq_b, tdata_a, tdata_b : std_logic_vector(DATA_REC_WIDTH-1 downto 0);
68
  signal reg0, reg1                   : T_DATA_REC := DATA_REC_INIT_DATA;
69
 
70
 
71
begin
72
 
73
  -- Convert our data records int std_logic_vector, so that
74
  -- standard DP RAM may handle it
75
  tdata_a <= tdrec2stlv(data_a);
76
  tdata_b <= tdrec2stlv(data_b);
77
 
78
  i1 : if ADDR_WIDTH > 0 generate
79
    -- When ADDR_WIDTH is above 0 embed the real DP RAM
80
    -- (even though synthesis tool may still replace it with
81
    -- registers during optimization for low ADDR_WIDTH)
82
 
83
    q_a <= stlv2tdrec(vq_a);
84
    q_b <= stlv2tdrec(vq_b);
85
    blockgen : if RAM_STYLE_G = "block" generate
86
      dp_ram_1 : entity work.dp_ram_scl_sorter
87
        generic map (
88
          DATA_WIDTH => DATA_REC_WIDTH,
89
          ADDR_WIDTH => ADDR_WIDTH)
90
        port map (
91
          clk    => clk,
92
          addr_a => addr_a(ADDR_WIDTH-1 downto 0),
93
          addr_b => addr_b(ADDR_WIDTH-1 downto 0),
94
          data_a => tdata_a,
95
          data_b => tdata_b,
96
          we_a   => we_a,
97
          we_b   => we_b,
98
          q_a    => vq_a,
99
          q_b    => vq_b);
100
 
101
    end generate;
102
 
103
    distribgen : if RAM_STYLE_G = "distributed" generate
104
      dp_ram_1 : entity work.dp_ram_scl_sorter_distributed
105
        generic map (
106
          DATA_WIDTH => DATA_REC_WIDTH,
107
          ADDR_WIDTH => ADDR_WIDTH)
108
        port map (
109
          clk    => clk,
110
          addr_a => addr_a(ADDR_WIDTH-1 downto 0),
111
          addr_b => addr_b(ADDR_WIDTH-1 downto 0),
112
          data_a => tdata_a,
113
          data_b => tdata_b,
114
          we_a   => we_a,
115
          we_b   => we_b,
116
          q_a    => vq_a,
117
          q_b    => vq_b);
118
 
119
    end generate;
120
 
121
 
122
  end generate i1;
123
 
124
  i2 : if ADDR_WIDTH = 0 generate
125
    -- When ADDR_WIDTH is 0, DP RAM should be simply replaced
126
    -- with a register implemented below
127
 
128
    p1 : process (clk)
129
    begin  -- process p1
130
      if clk'event and clk = '1' then   -- rising clock edge
131
        if we_a = '1' then
132
          reg0 <= data_a;
133
          reg1 <= data_a;
134
          q_a  <= data_a;
135
          q_b  <= data_a;
136
        elsif we_b = '1' then
137
          reg0 <= data_b;
138
          reg1 <= data_b;
139
          q_a  <= data_b;
140
          q_b  <= data_b;
141
        else
142
          reg1 <= reg0;
143
          q_a  <= reg1;
144
          q_b  <= reg1;
145
        end if;
146
      end if;
147
    end process p1;
148
 
149
  end generate i2;
150
 
151
  --dbg1 : if SORT_DEBUG generate
152
 
153
  --  -- Process monitoring read/write accesses to the memory (only for debugging)
154
  --  p3 : process (clk)
155
  --    variable rline : line;
156
  --  begin  -- process p1
157
  --    if clk'event and clk = '1' then   -- rising clock edge
158
  --      if(we_a = '1' and we_b = '1') then
159
  --        write(rline, NAME);
160
  --        write(rline, ADDR_WIDTH);
161
  --        write(rline, string'(" Possible write collision!"));
162
  --        writeline(reports, rline);
163
  --      end if;
164
 
165
--      if we_a = '1' then
166
--        write(rline, NAME);
167
--        write(rline, ADDR_WIDTH);
168
--        write(rline, string'(" WR_A:"));
169
--        wrstlv(rline, addr_a(ADDR_WIDTH-1 downto 0));
170
--        write(rline, string'(" VAL:"));
171
--        wrstlv(rline, tdata_a);
172
--        writeline(reports, rline);
173
--      end if;
174
--      if we_b = '1' then
175
--        write(rline, NAME);
176
--        write(rline, ADDR_WIDTH);
177
--        write(rline, string'(" WR_B:"));
178
--        wrstlv(rline, addr_b(ADDR_WIDTH-1 downto 0));
179
--        write(rline, string'(" VAL:"));
180
--        wrstlv(rline, tdata_b);
181
--        writeline(reports, rline);
182
--      end if;
183
--    end if;
184
--  end process p3;
185
--end generate dbg1;
186
end rtl;

powered by: WebSVN 2.1.0

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