⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ram_module.vhd

📁 Xilinx软核microblaze源码(VHDL)版本7.10
💻 VHD
📖 第 1 页 / 共 5 页
字号:
  constant byte_enable_bram_arch : boolean := (C_TARGET = VIRTEX5)   or (C_TARGET = VIRTEX4)    or                                              (C_TARGET = SPARTAN3A) or (C_TARGET = SPARTAN3AN) or                                              (C_TARGET = SPARTAN3Adsp);  constant arch_36kbit_bram      : boolean := (C_TARGET = VIRTEX5);  constant write_mode     : string := "READ_FIRST";  constant sim_check_mode : string := "NONE";  type bram_kind is (DISTRAM, B16_S1, B16_S2, B16_S4, B16_S9, B16_S18, B16_S36, B36_S1, B36_S2, B36_S4, B36_S9, B36_S18, B36_S36);  type BRAM_TYPE is record    What_Kind   : bram_kind;    Data_size   : natural;    Addr_size   : natural;    Parity_size : natural;    Par_Padding : natural;  end record BRAM_TYPE;  type ramb36_index_vector_type is array (boolean) of natural;  constant ramb36_index_vector : ramb36_index_vector_type := (false => 0, true => 6);  constant is_ram36            : natural                  := ramb36_index_vector(arch_36kbit_bram);  type ram_addr_vector is array (natural range 1 to 14) of integer;  type ram_select_vector is array (boolean) of ram_addr_vector;  constant ram_select_lookup : ram_select_vector :=    (false => (1, 2, 3, 4, 5, 6, 7, 8, 9+is_ram36, 10+is_ram36, 11+is_ram36, 12+is_ram36, 13+is_ram36, 14+is_ram36),     true  => (9+is_ram36, 9+is_ram36, 9+is_ram36, 9+is_ram36, 9+is_ram36, 9+is_ram36,               9+is_ram36, 9+is_ram36, 9+is_ram36, 10+is_ram36, 11+is_ram36, 12+is_ram36, 13+is_ram36, 14+is_ram36));  type bram_type_vector is array (natural range 1 to 21) of BRAM_TYPE;  constant bram_type_lookup : bram_type_vector :=    (1  => (what_kind => DISTRAM, Data_size => 8, Addr_size => 1, Parity_size => 0, Par_Padding => 0),     2  => (what_kind => DISTRAM, Data_size => 8, Addr_size => 2, Parity_size => 0, Par_Padding => 0),     3  => (what_kind => DISTRAM, Data_size => 8, Addr_size => 3, Parity_size => 0, Par_Padding => 0),     4  => (what_kind => DISTRAM, Data_size => 8, Addr_size => 4, Parity_size => 0, Par_Padding => 0),     5  => (what_kind => DISTRAM, Data_size => 8, Addr_size => 5, Parity_size => 0, Par_Padding => 0),     6  => (what_kind => DISTRAM, Data_size => 8, Addr_size => 6, Parity_size => 0, Par_Padding => 0),     7  => (what_kind => DISTRAM, Data_size => 8, Addr_size => 7, Parity_size => 0, Par_Padding => 0),     8  => (what_kind => DISTRAM, Data_size => 8, Addr_size => 8, Parity_size => 0, Par_Padding => 0),     9  => (what_kind => B16_S36, Data_size => 32, Addr_size => 9, Parity_size => 4, Par_Padding => 0),     10 => (what_kind => B16_S18, Data_size => 16, Addr_size => 10, Parity_size => 2, Par_Padding => 0),     11 => (what_kind => B16_S9,  Data_size => 8, Addr_size => 11, Parity_size => 1, Par_Padding => 0),     12 => (what_kind => B16_S4,  Data_size => 4, Addr_size => 12, Parity_size => 0, Par_Padding => 1),     13 => (what_kind => B16_S2,  Data_size => 2, Addr_size => 13, Parity_size => 0, Par_Padding => 1),     14 => (what_kind => B16_S1,  Data_size => 1, Addr_size => 14, Parity_size => 0, Par_Padding => 1),          15 => (what_kind => B36_S36, Data_size => 32, Addr_size => 10, Parity_size => 4, Par_Padding => 0),     16 => (what_kind => B36_S36, Data_size => 32, Addr_size => 10, Parity_size => 4, Par_Padding => 0),     17 => (what_kind => B36_S18, Data_size => 16, Addr_size => 11, Parity_size => 2, Par_Padding => 0),     18 => (what_kind => B36_S9,  Data_size => 8, Addr_size => 12, Parity_size => 1, Par_Padding => 0),     19 => (what_kind => B36_S4,  Data_size => 4, Addr_size => 13, Parity_size => 0, Par_Padding => 1),     20 => (what_kind => B36_S2,  Data_size => 2, Addr_size => 14, Parity_size => 0, Par_Padding => 1),     21 => (what_kind => B36_S1,  Data_size => 1, Addr_size => 15, Parity_size => 0, Par_Padding => 1)     );  constant What_BRAM : BRAM_TYPE := bram_type_lookup(ram_select_lookup(C_FORCE_BRAM)(C_ADDR_WIDTH));  constant bram_full_data_width : natural := What_BRAM.Data_size + What_BRAM.Parity_size;  constant nr_of_brams         : natural := (C_DATA_WIDTH + bram_full_data_width-1)/bram_full_data_width;  constant just_data_bits_size : natural := nr_of_brams*What_BRAM.Data_size;  constant Using_Parity_bits : boolean := C_DATA_WIDTH > just_data_bits_size;  -- local signals for padding if the size doesn't match perfectly  signal addra_i     : std_logic_vector(0 to What_BRAM.Addr_size-1);  signal addrb_i     : std_logic_vector(0 to What_BRAM.Addr_size-1);  signal data_ina_i  : std_logic_vector(0 to nr_of_brams*What_BRAM.Data_size-1);  signal data_inb_i  : std_logic_vector(0 to nr_of_brams*What_BRAM.Data_size-1);  signal data_outa_i : std_logic_vector(0 to nr_of_brams*What_BRAM.Data_size-1);  signal data_outb_i : std_logic_vector(0 to nr_of_brams*What_BRAM.Data_size-1);  signal data_inpa_i  : std_logic_vector(0 to nr_of_brams*What_BRAM.Parity_size-1+What_BRAM.Par_Padding);  signal data_inpb_i  : std_logic_vector(0 to nr_of_brams*What_BRAM.Parity_size-1+What_BRAM.Par_Padding);  signal data_outpa_i : std_logic_vector(0 to nr_of_brams*What_BRAM.Parity_size-1+What_BRAM.Par_Padding);  signal data_outpb_i : std_logic_vector(0 to nr_of_brams*What_BRAM.Parity_size-1+What_BRAM.Par_Padding);begin  -- architecture IMP    Data_Size_Less_Than_Bram_Size: if (C_DATA_WIDTH < just_data_bits_size) generate    padding_vectors : process(ADDRA, ADDRB, DATA_INA, DATA_INB, data_outa_i,                              data_outb_i, data_outpa_i, data_outpb_i) is    begin  -- process padding_vectors      addra_i              <= (others => '0');      addra_i(ADDRA'range) <= ADDRA;      addrb_i              <= (others => '0');      addrb_i(ADDRB'range) <= ADDRB;      -- Default drive the parity inputs to '0'      data_inpa_i <= (others => '0');      data_inpb_i <= (others => '0');            data_ina_i                 <= (others => '0');      data_ina_i(DATA_INA'range) <= DATA_INA;      DATA_OUTA                  <= data_outa_i(DATA_OUTA'range);      data_inb_i                 <= (others => '0');      data_inb_i(DATA_INB'range) <= DATA_INB;      DATA_OUTB                  <= data_outb_i(DATA_OUTB'range);    end process padding_vectors;      end generate Data_Size_Less_Than_Bram_Size;  Data_Size_Larger_Than_BRAM_Size: if (C_DATA_WIDTH > just_data_bits_size) generate    padding_vectors : process(ADDRA, ADDRB, DATA_INA, DATA_INB, data_outa_i,                              data_outb_i, data_outpa_i, data_outpb_i) is    begin  -- process padding_vectors      addra_i              <= (others => '0');      addra_i(ADDRA'range) <= ADDRA;      addrb_i              <= (others => '0');      addrb_i(ADDRB'range) <= ADDRB;      -- Default drive the parity inputs to '0'      data_inpa_i <= (others => '0');      data_inpb_i <= (others => '0');      data_ina_i                                           <= DATA_INA(0 to just_data_bits_size-1);      data_inpa_i(0 to C_DATA_WIDTH-just_data_bits_size-1) <= DATA_INA(just_data_bits_size to C_DATA_WIDTH-1);      DATA_OUTA                                            <= data_outa_i & data_outpa_i(0 to C_DATA_WIDTH-just_data_bits_size-1);      data_inb_i                                           <= DATA_INB(0 to just_data_bits_size-1);      data_inpb_i(0 to C_DATA_WIDTH-just_data_bits_size-1) <= DATA_INB(just_data_bits_size to C_DATA_WIDTH-1);      DATA_OUTB                                            <= data_outb_i & data_outpb_i(0 to C_DATA_WIDTH-just_data_bits_size-1);    end process padding_vectors;      end generate Data_Size_Larger_Than_BRAM_Size;  Data_Size_Equal_To_BRAM_Size: if (C_DATA_WIDTH = just_data_bits_size) generate    padding_vectors : process(ADDRA, ADDRB, DATA_INA, DATA_INB, data_outa_i,                              data_outb_i, data_outpa_i, data_outpb_i) is    begin  -- process padding_vectors      addra_i              <= (others => '0');      addra_i(ADDRA'range) <= ADDRA;      addrb_i              <= (others => '0');      addrb_i(ADDRB'range) <= ADDRB;      -- Default drive the parity inputs to '0'      data_inpa_i <= (others => '0');      data_inpb_i <= (others => '0');      data_ina_i <= DATA_INA;      DATA_OUTA  <= data_outa_i;      data_inb_i <= DATA_INB;      DATA_OUTB  <= data_outb_i;    end process padding_vectors;      end generate Data_Size_Equal_To_BRAM_Size;  -----------------------------------------------------------------------------  -----------------------------------------------------------------------------  --  BRAM organizaed as x36  ------------------------------------------------------------------------------  ------------------------------------------------------------------------------  Using_B16_S36 : if (What_BRAM.What_Kind = B16_S36) or (What_BRAM.What_Kind = B36_S36) generate    Using_S36_Virtex5 : if (C_TARGET = VIRTEX5) generate      signal wea_i   : std_logic_vector(0 to 3);      signal web_i   : std_logic_vector(0 to 3);      signal addra_i : std_logic_vector(15 downto 0);      signal addrb_i : std_logic_vector(15 downto 0);    begin      Pad_RAMB16_Signals : process (ADDRA, ADDRB, WEA, WEB) is      begin  -- process Pad_RAMB16_Signals        wea_i                              <= (others => '0');        wea_i(WEA'range)                   <= WEA;        addra_i                            <= (others => '0');                                        -- Address bit 15 is only used when BRAM are cascaded        addra_i(14 downto 15-C_ADDR_WIDTH) <= ADDRA;        web_i                              <= (others => '0');        web_i(WEB'range)                   <= WEB;        addrb_i                            <= (others => '0');                                        -- Address bit 15 is only used when BRAM are cascaded        addrb_i(14 downto 15-C_ADDR_WIDTH) <= ADDRB;      end process Pad_RAMB16_Signals;      RAMB36_I1 : RAMB36        generic map (          DOA_REG             => 0,               -- [integer]          DOB_REG             => 0,               -- [integer]          RAM_EXTENSION_A     => "NONE",          -- [string]          RAM_EXTENSION_B     => "NONE",          -- [string]          READ_WIDTH_A        => 36,              -- [integer]          READ_WIDTH_B        => 36,              -- [integer]          SIM_COLLISION_CHECK => sim_check_mode,  -- [string]          WRITE_MODE_A        => write_mode,      -- [string]          WRITE_MODE_B        => write_mode,      -- [string]          WRITE_WIDTH_A       => 36,              -- [integer]          WRITE_WIDTH_B       => 36)              -- [integer]        port map (          CLKA => CLKA,                           -- [in                        ENA  => ENA,                            -- [in  std_ulogic]          ADDRA          => addra_i,    -- [in  std_logic_vector(15 downto 0)]          WEA            => wea_i,      -- [in  std_logic_vector(3 downto 0)]          DIA            => data_ina_i,  -- [in  std_logic_vector (31 downto 0)]          DIPA           => data_inpa_i,  -- [in  std_logic_vector (3 downto 0)]          DOA            => data_outa_i,  -- [out std_logic_vector (31 downto 0)]          DOPA           => data_outpa_i,  -- [out std_logic_vector (3 downto 0)]          SSRA           => '0',        -- [in  std_ulogic]          REGCEA         => '1',        -- [in  std_ulogic]          CASCADEOUTLATA => open,       -- [out std_ulogic]          CASCADEINLATA  => '0',        -- [in  std_ulogic]          CASCADEINREGA  => '0',        -- [in  std_ulogic]          CASCADEOUTREGA => open,       -- [out std_ulogic]          CLKB => CLKB,                 -- [in  std_ulogic]                      ENB  => ENB,                  -- [in  std_ulogic]          ADDRB          => addrb_i,    -- [in  std_logic_vector(15 downto 0)]          WEB            => web_i,      -- [in std_logic_vector(3 downto 0)]          DIB            => data_inb_i,  -- [in  std_logic_vector (31 downto 0)]          DIPB           => data_inpb_i,  -- [in  std_logic_vector (3 downto 0)]          DOB            => data_outb_i,  -- [out std_logic_vector (31 downto 0)]          DOPB           => data_outpb_i,  -- [out std_logic_vector (3 downto 0)]          SSRB           => '0',        -- [in  std_ulogic]          REGCEB         => '1',        -- [in  std_ulogic]          CASCADEOUTLATB => open,       -- [out std_ulogic]          CASCADEINLATB  => '0',        -- [in  std_ulogic]          CASCADEINREGB  => '0',        -- [in  std_ulogic]          CASCADEOUTREGB => open);      -- [out std_ulogic]    end generate Using_S36_Virtex5;    Using_S36_Virtex4 : if (C_TARGET = VIRTEX4) generate      signal wea_i   : std_logic_vector(0 to 3);      signal web_i   : std_logic_vector(0 to 3);      signal addra_i : std_logic_vector(14 downto 0);      signal addrb_i : std_logic_vector(14 downto 0);    begin      Pad_RAMB16_Signals : process (ADDRA, ADDRB, WEA, WEB) is      begin  -- process Pad_RAMB16_Signals        wea_i                              <= (others => '0');        wea_i(WEA'range)                   <= WEA;        addra_i                            <= (others => '0');                                        -- Address bit 14 is only used when BRAM are cascaded        addra_i(13 downto 14-C_ADDR_WIDTH) <= ADDRA;        web_i                              <= (others => '0');        web_i(WEB'range)                   <= WEB;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -