zoukankan      html  css  js  c++  java
  • Parametrilayze based on SRL16 shift register FIFO

      1 -------------------------------------------------------------------------------
      2 -- Title      : Parametrilayze based on SRL16 shift register FIFO
      3 -- Project    : 
      4 -------------------------------------------------------------------------------
      5 -- File       : fifo_srl_uni.vhd
      6 -- Author     : Tomasz Turek  <tomasz.turek@gmail.com>
      7 -- Company    : SzuWar INC
      8 -- Created    : 13:27:31 14-03-2010
      9 -- Last update: 15:02:32 21-03-2010
     10 -- Platform   : Xilinx ISE 10.1.03
     11 -- Standard   : VHDL'93
     12 -------------------------------------------------------------------------------
     13 -- Description: 
     14 -------------------------------------------------------------------------------
     15 -- Copyright (c) 2010 SzuWar INC
     16 -------------------------------------------------------------------------------
     17 -- Revisions  :
     18 -- Date                  Version  Author  Description
     19 -- 13:27:31 14-03-2010   1.0      szuwarek  Created
     20 -------------------------------------------------------------------------------
     21 -- Version 1.1 unlimited size of Input and Output register.
     22 -- Version 1.0
     23 
     24 library IEEE;
     25 use IEEE.STD_LOGIC_1164.all;
     26 use ieee.std_logic_arith.all;
     27 use IEEE.STD_LOGIC_UNSIGNED.all;
     28 
     29 library UNISIM;
     30 use UNISIM.vcomponents.all;
     31 
     32 entity fifo_srl_uni is
     33 
     34   generic (
     35     iDataWidth        : integer range 1 to 32   := 17;
     36     ififoWidth        : integer range 1 to 1023 := 32;
     37     iInputReg         : integer range 0 to 3    := 0;
     38     iOutputReg        : integer range 0 to 3    := 2;
     39     iFullFlagOfSet    : integer range 0 to 1021 := 2;
     40     iEmptyFlagOfSet   : integer range 0 to 1021 := 5;
     41     iSizeDelayCounter : integer range 5 to 11   := 6
     42   );
     43 
     44   port (
     45     CLK_I          : in  std_logic;
     46     DATA_I         : in  std_logic_vector(iDataWidth - 1 downto 0);
     47     DATA_O         : out std_logic_vector(iDataWidth - 1 downto 0);
     48     WRITE_ENABLE_I : in  std_logic;
     49     READ_ENABLE_I  : in  std_logic;
     50     READ_VALID_O   : out std_logic;
     51     FIFO_COUNT_O   : out std_logic_vector(iSizeDelayCounter - 1 downto 0);
     52     FULL_FLAG_O    : out std_logic;
     53     EMPTY_FLAG_O   : out std_logic
     54   );
     55 
     56 end entity fifo_srl_uni;
     57 
     58 architecture fifo_srl_uni_rtl of fifo_srl_uni is
     59 
     60 -------------------------------------------------------------------------------
     61 -- functions --
     62 -------------------------------------------------------------------------------
     63   function f_srl_count (constant c_fifo_size : integer) return integer is
     64 
     65     variable i_temp  : integer;
     66     variable i_count : integer;
     67 
     68   begin  -- function f_srl_count
     69 
     70     i_temp  := c_fifo_size;
     71     i_count := 0;
     72 
     73     for i in 0 to 64 loop
     74 
     75       if i_temp < 1 then
     76 
     77         if i_count = 0 then
     78 
     79           i_count := i;
     80 
     81         else
     82 
     83           i_count := i_count;
     84 
     85         end if;
     86 
     87       else
     88 
     89         i_temp := i_temp - 16;
     90 
     91       end if;
     92 
     93     end loop;  -- i
     94 
     95     return i_count;
     96 
     97   end function f_srl_count;
     98 
     99 -------------------------------------------------------------------------------
    100 -- constants --
    101 -------------------------------------------------------------------------------
    102   constant c_srl_count : integer range 0 to 64 := f_srl_count(ififoWidth);
    103 
    104 -------------------------------------------------------------------------------
    105 -- types --
    106 -------------------------------------------------------------------------------
    107   type type_in_reg    is array (0 to iInputReg - 1)   of std_logic_vector(iDataWidth - 1 downto 0);
    108   type type_out_reg   is array (0 to iOutputReg)      of std_logic_vector(iDataWidth - 1 downto 0);
    109   type type_data_path is array (0 to c_srl_count - 1) of std_logic_vector(iDataWidth - 1 downto 0);
    110   type type_srl_path  is array (0 to c_srl_count)    of std_logic_vector(iDataWidth - 1 downto 0);
    111 
    112 -------------------------------------------------------------------------------
    113 -- signals --
    114 -------------------------------------------------------------------------------
    115   signal v_delay_counter : std_logic_vector(iSizeDelayCounter - 1 downto 0) := (others => '0');
    116   signal v_size_counter  : std_logic_vector(iSizeDelayCounter - 1 downto 0) := (others => '0');
    117   signal v_zeros         : std_logic_vector(iSizeDelayCounter - 1 downto 0) := (others => '0');
    118   signal v_WRITE_ENABLE  : std_logic_vector(iInputReg downto 0);
    119   signal v_READ_ENABLE   : std_logic_vector(iOutputReg downto 0);
    120   signal v_valid_delay   : std_logic_vector(iOutputReg downto 0);
    121   signal i_size_counter  : integer range 0 to 1023 := 0;
    122   signal i_srl_select    : integer range 0 to 64 := 0;
    123   signal i_temp          : integer range 0 to 64;
    124   signal t_mux_in        : type_data_path;
    125   signal t_srl_in        : type_srl_path;
    126   signal t_mux_out       : type_out_reg;
    127   signal t_reg_in        : type_in_reg;
    128   signal one_delay       : std_logic := '0';
    129   signal ce_master       : std_logic;
    130   signal full_capacity   : std_logic;
    131   signal data_valid_off  : std_logic;
    132 
    133 begin  -- architecture fifo_srl_uni_r
    134 
    135   v_zeros <= (others => '0');
    136 
    137   i_srl_select   <= conv_integer((v_delay_counter(iSizeDelayCounter - 1 downto 4)));
    138   i_size_counter <= conv_integer(v_size_counter);
    139 
    140   ce_master <= v_WRITE_ENABLE(0) and (not full_capacity);
    141 
    142   full_capacity <= '0' when i_size_counter < ififoWidth else '1';
    143 
    144   t_mux_out(0) <= t_mux_in(i_srl_select);
    145   READ_VALID_O <= v_READ_ENABLE(0) and (not v_valid_delay(0));
    146   FIFO_COUNT_O <= v_size_counter;
    147 
    148 -------------------------------------------------------------------------------
    149 -- Input Register --
    150 -------------------------------------------------------------------------------
    151   GR0 : if iInputReg = 0 generate
    152 
    153     t_srl_in(0)               <= DATA_I;
    154     v_WRITE_ENABLE(iInputReg) <= WRITE_ENABLE_I;
    155 
    156   end generate GR0;
    157 
    158   GR1 : if iInputReg = 1 generate
    159 
    160     t_srl_in(0)               <= t_reg_in(0);
    161     v_WRITE_ENABLE(iInputReg) <= WRITE_ENABLE_I;
    162 
    163     P1 : process (CLK_I) is
    164     begin  -- process P1
    165 
    166       if rising_edge(CLK_I) then
    167 
    168         t_reg_in(0)       <= DATA_I;
    169         v_WRITE_ENABLE(0) <= v_WRITE_ENABLE(iInputReg);
    170 
    171       end if;
    172 
    173     end process P1;
    174 
    175   end generate GR1;
    176 
    177   GR2 : if iInputReg > 1 generate
    178 
    179     t_srl_in(0)               <= t_reg_in(0);
    180     v_WRITE_ENABLE(iInputReg) <= WRITE_ENABLE_I;
    181 
    182     P1 : process (CLK_I) is
    183     begin  -- process P1
    184 
    185       if rising_edge(CLK_I) then
    186 
    187         t_reg_in(iInputReg - 1)                <= DATA_I;
    188         t_reg_in(0 to iInputReg - 2)           <= t_reg_in(1 to iInputReg -1);
    189         v_WRITE_ENABLE(iInputReg - 1 downto 0) <= v_WRITE_ENABLE(iInputReg downto 1);
    190 
    191       end if;
    192 
    193     end process P1;
    194 
    195   end generate GR2;
    196 -------------------------------------------------------------------------------
    197 -- Input Register --
    198 -------------------------------------------------------------------------------
    199 
    200 -------------------------------------------------------------------------------
    201 -- FIFO Core, SRL16E based --
    202 -------------------------------------------------------------------------------
    203   G1 : for i in 0 to c_srl_count - 1 generate
    204 
    205     G0 : for j in 0 to iDataWidth - 1 generate
    206 
    207       SRLC16_inst : SRLC16E
    208       port map
    209             (
    210         Q   => t_mux_in(i)(j), -- SRL data output
    211         Q15 => t_srl_in(i+1)(j), -- Carry output (connect to next SRL)
    212         A0  => v_delay_counter(0), -- Select[0] input
    213         A1  => v_delay_counter(1), -- Select[1] input
    214         A2  => v_delay_counter(2), -- Select[2] input
    215         A3  => v_delay_counter(3), -- Select[3] input
    216         CE  => ce_master, -- Clock enable input
    217         CLK => CLK_I, -- Clock input
    218         D   => t_srl_in(i)(j) -- SRL data input
    219       );
    220 
    221     end generate G0;
    222 
    223   end generate G1;
    224 -------------------------------------------------------------------------------
    225 -- FIFO Core, SRL16E based --
    226 -------------------------------------------------------------------------------
    227 
    228   P0 : process (CLK_I) is
    229   begin  -- process P0
    230 
    231     if rising_edge(CLK_I) then
    232 
    233       if (v_WRITE_ENABLE(0) = '1') and (READ_ENABLE_I = '0') and (i_size_counter < ififoWidth) then
    234 
    235         if one_delay = '1' then
    236 
    237           v_delay_counter <= v_delay_counter + 1;
    238           one_delay       <= '1';
    239 
    240         else
    241 
    242           one_delay       <= '1';
    243           v_delay_counter <= v_delay_counter;
    244 
    245         end if;
    246 
    247         v_size_counter <= v_size_counter + 1;
    248 
    249       elsif (v_WRITE_ENABLE(0) = '0') and (READ_ENABLE_I = '1') and (i_size_counter > 0) then
    250 
    251         if v_delay_counter = v_zeros then
    252 
    253           one_delay <= '0';
    254 
    255         else
    256 
    257           one_delay       <= '1';
    258           v_delay_counter <= v_delay_counter - 1;
    259 
    260         end if;
    261 
    262         v_size_counter <= v_size_counter - 1;
    263 
    264       else
    265 
    266         v_delay_counter <= v_delay_counter;
    267         v_size_counter  <= v_size_counter;
    268         one_delay       <= one_delay;
    269 
    270       end if;
    271 
    272     end if;
    273 
    274   end process P0;
    275 
    276   data_valid_off <= '1' when i_size_counter = 0 else '0';
    277 -------------------------------------------------------------------------------
    278 -- Output Register --
    279 -------------------------------------------------------------------------------
    280 
    281    -- size of output register: 0 --
    282   GM0 : if iOutputReg = 0 generate
    283 
    284     DATA_O           <= t_mux_out(0);
    285     v_READ_ENABLE(0) <= READ_ENABLE_I;
    286     v_valid_delay(0) <= data_valid_off;
    287 
    288   end generate GM0;
    289 
    290    -- size of output register: 1 --
    291   GM1 : if iOutputReg = 1 generate
    292 
    293     DATA_O           <= t_mux_out(1);
    294     v_READ_ENABLE(1) <= READ_ENABLE_I;
    295 
    296 
    297     P2 : process (CLK_I) is
    298     begin  -- process P2
    299 
    300       if rising_edge(CLK_I) then
    301 
    302         v_READ_ENABLE(0) <= v_READ_ENABLE(1);
    303         t_mux_out(1)     <= t_mux_out(0);
    304         v_valid_delay(0) <= data_valid_off;
    305 
    306       end if;
    307 
    308     end process P2;
    309 
    310   end generate GM1;
    311 
    312    -- size of output register: > 1 --
    313   GM2 : if iOutputReg > 1 generate
    314 
    315     DATA_O                    <= t_mux_out(iOutputReg);
    316     v_READ_ENABLE(iOutputReg) <= READ_ENABLE_I;
    317 
    318     P2 : process (CLK_I) is
    319     begin  -- process P2
    320 
    321       if rising_edge(CLK_I) then
    322 
    323         v_READ_ENABLE(iOutputReg - 1 downto 0) <= v_READ_ENABLE(iOutputReg downto 1);
    324         t_mux_out(1 to iOutputReg)             <= t_mux_out(0 to iOutputReg - 1);
    325         v_valid_delay(iOutputReg - 1 downto 0) <= data_valid_off & v_valid_delay(iOutputReg - 1 downto 1);
    326 
    327       end if;
    328 
    329     end process P2;
    330 
    331   end generate GM2;
    332 -------------------------------------------------------------------------------
    333 -- Output Register --
    334 -------------------------------------------------------------------------------
    335 
    336 -------------------------------------------------------------------------------
    337 -- Flag Generators --
    338 -------------------------------------------------------------------------------
    339   EMPTY_FLAG_O <= '0' when (i_size_counter) > iEmptyFlagOfSet             else '1';
    340   FULL_FLAG_O  <= '1' when i_size_counter >= ififoWidth - iFullFlagOfSet else '0';
    341 -------------------------------------------------------------------------------
    342 -- Flag Generators --
    343 -------------------------------------------------------------------------------
    344 
    345 end architecture fifo_srl_uni_rtl;

  • 相关阅读:
    查看数据库错误日志的位置
    快速过滤出完整的SQL语句
    使用apidocJs快速生成在线文档
    vs开发nodejs系列之 修改新建js文件的模板
    Node.js 入门资料
    ECMAScript 6 学习资料
    NodeJS学习目录
    MongoDB学习笔记系列~目录
    sails ORM组件 Waterline v0.10 英文文档
    node.js---sails项目开发
  • 原文地址:https://www.cnblogs.com/shangdawei/p/2494220.html
Copyright © 2011-2022 走看看