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

📄 stratixii_atoms.vhd

📁 free hardware ip core about sparcv8,a soc cpu in vhdl
💻 VHD
📖 第 1 页 / 共 5 页
字号:
VARIABLE pulse_VitalGlitchData : VitalGlitchDataType;BEGIN    WAIT UNTIL state'EVENT;    VitalPathDelay01 (        OutSignal     => pulse,        OutSignalName => "pulse",        OutTemp       => state,        Paths         => (0 => (clk_ipd'LAST_EVENT,tpd_clk_pulse_posedge,TRUE)),        GlitchData    => pulse_VitalGlitchData,        Mode          => DefGlitchMode,        XOn           => DefXOnChecks,        MsgOn         => DefMsgOnChecks    );END PROCESS;cycle <= clk_ipd;END pgen_arch;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.VITAL_Timing.all;USE IEEE.VITAL_Primitives.all;USE work.stratixii_atom_pack.all;USE work.stratixii_ram_register;USE work.stratixii_ram_pulse_generator;ENTITY stratixii_ram_block IS    GENERIC (        -- -------- GLOBAL PARAMETERS ---------        operation_mode                 :  STRING := "single_port";        mixed_port_feed_through_mode   :  STRING := "dont_care";        ram_block_type                 :  STRING := "auto";        logical_ram_name               :  STRING := "ram_name";        init_file                      :  STRING := "init_file.hex";        init_file_layout               :  STRING := "none";        data_interleave_width_in_bits  :  INTEGER := 1;        data_interleave_offset_in_bits :  INTEGER := 1;        port_a_logical_ram_depth       :  INTEGER := 0;        port_a_logical_ram_width       :  INTEGER := 0;        port_a_first_address           :  INTEGER := 0;        port_a_last_address            :  INTEGER := 0;        port_a_first_bit_number        :  INTEGER := 0;        port_a_data_in_clear           :  STRING := "none";        port_a_address_clear           :  STRING := "none";        port_a_write_enable_clear      :  STRING := "none";        port_a_data_out_clear          :  STRING := "none";        port_a_byte_enable_clear       :  STRING := "none";        port_a_data_in_clock           :  STRING := "clock0";        port_a_address_clock           :  STRING := "clock0";        port_a_write_enable_clock      :  STRING := "clock0";        port_a_byte_enable_clock       :  STRING := "clock0";        port_a_data_out_clock          :  STRING := "none";        port_a_data_width              :  INTEGER := 1;        port_a_address_width           :  INTEGER := 1;        port_a_byte_enable_mask_width  :  INTEGER := 1;        port_b_logical_ram_depth       :  INTEGER := 0;        port_b_logical_ram_width       :  INTEGER := 0;        port_b_first_address           :  INTEGER := 0;        port_b_last_address            :  INTEGER := 0;        port_b_first_bit_number        :  INTEGER := 0;        port_b_data_in_clear           :  STRING := "none";        port_b_address_clear           :  STRING := "none";        port_b_read_enable_write_enable_clear: STRING := "none";        port_b_byte_enable_clear       :  STRING := "none";        port_b_data_out_clear          :  STRING := "none";        port_b_data_in_clock           :  STRING := "clock0";        port_b_address_clock           :  STRING := "clock0";        port_b_read_enable_write_enable_clock: STRING := "clock0";        port_b_byte_enable_clock       :  STRING := "none";        port_b_data_out_clock          :  STRING := "none";        port_b_data_width              :  INTEGER := 1;        port_b_address_width           :  INTEGER := 1;        port_b_byte_enable_mask_width  :  INTEGER := 1;        power_up_uninitialized         :  STRING := "false";        port_b_disable_ce_on_output_registers : STRING := "off";        port_b_disable_ce_on_input_registers : STRING := "off";        port_b_byte_size : INTEGER := 0;        port_a_disable_ce_on_output_registers : STRING := "off";        port_a_disable_ce_on_input_registers : STRING := "off";        port_a_byte_size : INTEGER := 0;        lpm_type                  : string := "stratixii_ram_block";        lpm_hint                  : string := "true";        connectivity_checking     : string := "off";        mem_init0 : BIT_VECTOR := X"0";        mem_init1 : BIT_VECTOR := X"0"        );    -- -------- PORT DECLARATIONS ---------    PORT (        portadatain             : IN STD_LOGIC_VECTOR(port_a_data_width - 1 DOWNTO 0)    := (OTHERS => '0');        portaaddr               : IN STD_LOGIC_VECTOR(port_a_address_width - 1 DOWNTO 0) := (OTHERS => '0');        portawe                 : IN STD_LOGIC := '0';        portbdatain             : IN STD_LOGIC_VECTOR(port_b_data_width - 1 DOWNTO 0)    := (OTHERS => '0');        portbaddr               : IN STD_LOGIC_VECTOR(port_b_address_width - 1 DOWNTO 0) := (OTHERS => '0');        portbrewe               : IN STD_LOGIC := '0';        clk0                    : IN STD_LOGIC := '0';        clk1                    : IN STD_LOGIC := '0';        ena0                    : IN STD_LOGIC := '1';        ena1                    : IN STD_LOGIC := '1';        clr0                    : IN STD_LOGIC := '0';        clr1                    : IN STD_LOGIC := '0';        portabyteenamasks       : IN STD_LOGIC_VECTOR(port_a_byte_enable_mask_width - 1 DOWNTO 0) := (OTHERS => '1');        portbbyteenamasks       : IN STD_LOGIC_VECTOR(port_b_byte_enable_mask_width - 1 DOWNTO 0) := (OTHERS => '1');        devclrn                 : IN STD_LOGIC := '1';        devpor                  : IN STD_LOGIC := '1';         portaaddrstall : IN STD_LOGIC := '0';         portbaddrstall : IN STD_LOGIC := '0';        portadataout            : OUT STD_LOGIC_VECTOR(port_a_data_width - 1 DOWNTO 0);        portbdataout            : OUT STD_LOGIC_VECTOR(port_b_data_width - 1 DOWNTO 0)        );END stratixii_ram_block;ARCHITECTURE block_arch OF stratixii_ram_block ISCOMPONENT stratixii_ram_pulse_generator    PORT (          clk                     : IN  STD_LOGIC;          ena                     : IN  STD_LOGIC;          pulse                   : OUT STD_LOGIC;          cycle                   : OUT STD_LOGIC    );END COMPONENT;COMPONENT stratixii_ram_register    GENERIC (        preset                    :  STD_LOGIC := '0';        width                     :  integer := 1    );    PORT    (        d                       : IN  STD_LOGIC_VECTOR(width - 1 DOWNTO 0);        clk                     : IN  STD_LOGIC;        aclr                    : IN  STD_LOGIC;        devclrn                 : IN  STD_LOGIC;        devpor                  : IN  STD_LOGIC;        ena                     : IN  STD_LOGIC;        stall                     : IN  STD_LOGIC;        q                       : OUT STD_LOGIC_VECTOR(width - 1 DOWNTO 0);        aclrout                 : OUT STD_LOGIC     );END COMPONENT;FUNCTION cond (condition : BOOLEAN;CONSTANT a,b : INTEGER) RETURN INTEGER ISVARIABLE c: INTEGER;BEGIN    IF (condition) THEN c := a; ELSE c := b; END IF;    RETURN c;END;SUBTYPE port_type IS BOOLEAN;CONSTANT primary   : port_type := TRUE;CONSTANT secondary : port_type := FALSE;CONSTANT primary_port_is_a : BOOLEAN := (port_b_data_width <= port_a_data_width);CONSTANT primary_port_is_b : BOOLEAN := NOT primary_port_is_a;CONSTANT mode_is_rom : BOOLEAN := (operation_mode = "rom");CONSTANT mode_is_sp  : BOOLEAN := (operation_mode = "single_port");CONSTANT mode_is_dp  : BOOLEAN := (operation_mode = "dual_port");CONSTANT mode_is_bdp : BOOLEAN := (operation_mode = "bidir_dual_port");CONSTANT wired_mode : BOOLEAN := (port_a_address_width = port_b_address_width) AND (port_a_address_width = 1)                                  AND (port_a_data_width /= port_b_data_width);CONSTANT num_cols : INTEGER := cond(mode_is_rom OR mode_is_sp,1,                                    cond(wired_mode,2,2 ** (ABS(port_b_address_width - port_a_address_width))));CONSTANT data_width      : INTEGER := cond(primary_port_is_a,port_a_data_width,port_b_data_width);CONSTANT data_unit_width : INTEGER := cond(mode_is_rom OR mode_is_sp OR primary_port_is_b,port_a_data_width,port_b_data_width);CONSTANT address_unit_width : INTEGER := cond(mode_is_rom OR mode_is_sp OR primary_port_is_a,port_a_address_width,port_b_address_width);CONSTANT address_width      : INTEGER := cond(mode_is_rom OR mode_is_sp OR primary_port_is_b,port_a_address_width,port_b_address_width);CONSTANT byte_size_a : INTEGER := port_a_data_width / port_a_byte_enable_mask_width;CONSTANT byte_size_b : INTEGER := port_b_data_width / port_b_byte_enable_mask_width;CONSTANT out_a_is_reg : BOOLEAN := (port_a_data_out_clock /= "none" AND port_a_data_out_clock /= "UNUSED");CONSTANT out_b_is_reg : BOOLEAN := (port_b_data_out_clock /= "none" AND port_b_data_out_clock /= "UNUSED");CONSTANT bytes_a_disabled : STD_LOGIC_VECTOR(port_a_byte_enable_mask_width - 1 DOWNTO 0) := (OTHERS => '0');CONSTANT bytes_b_disabled : STD_LOGIC_VECTOR(port_b_byte_enable_mask_width - 1 DOWNTO 0) := (OTHERS => '0');CONSTANT ram_type : BOOLEAN := (ram_block_type = "M-RAM" OR ram_block_type = "m-ram" OR ram_block_type = "MegaRAM" OR                               (ram_block_type = "auto"  AND mixed_port_feed_through_mode = "dont_care" AND port_b_read_enable_write_enable_clock = "clock0"));TYPE bool_to_std_logic_map IS ARRAY(TRUE DOWNTO FALSE) OF STD_LOGIC;CONSTANT bool_to_std_logic : bool_to_std_logic_map := ('1','0');-- -------- internal signals ----------- clock / clock enableSIGNAL clk_a_in,clk_b_in : STD_LOGIC;SIGNAL clk_a_byteena,clk_b_byteena : STD_LOGIC;SIGNAL clk_a_out,clk_b_out : STD_LOGIC;SIGNAL clkena_a_out,clkena_b_out : STD_LOGIC;SIGNAL write_cycle_a,write_cycle_b : STD_LOGIC;-- asynch clearTYPE   clear_mode_type IS ARRAY (port_type'HIGH DOWNTO port_type'LOW) OF BOOLEAN;TYPE   clear_vec_type  IS ARRAY (port_type'HIGH DOWNTO port_type'LOW) OF STD_LOGIC;SIGNAL datain_a_clr,datain_b_clr   :  STD_LOGIC;SIGNAL dataout_a_clr,dataout_b_clr :  STD_LOGIC;SIGNAL addr_a_clr,addr_b_clr       :  STD_LOGIC;SIGNAL byteena_a_clr,byteena_b_clr :  STD_LOGIC;SIGNAL we_a_clr,rewe_b_clr         :  STD_LOGIC;SIGNAL datain_a_clr_in,datain_b_clr_in :  STD_LOGIC;SIGNAL addr_a_clr_in,addr_b_clr_in     :  STD_LOGIC;SIGNAL byteena_a_clr_in,byteena_b_clr_in  :  STD_LOGIC;SIGNAL we_a_clr_in,rewe_b_clr_in          :  STD_LOGIC;SIGNAL mem_invalidate,mem_invalidate_loc,read_latch_invalidate : clear_mode_type;SIGNAL clear_asserted_during_write :  clear_vec_type;SUBTYPE one_bit_bus_type IS STD_LOGIC_VECTOR(0 DOWNTO 0);-- port A registersSIGNAL we_a_reg                 :  STD_LOGIC;SIGNAL we_a_reg_in,we_a_reg_out :  one_bit_bus_type;SIGNAL addr_a_reg               :  STD_LOGIC_VECTOR(port_a_address_width - 1 DOWNTO 0);SIGNAL datain_a_reg             :  STD_LOGIC_VECTOR(port_a_data_width - 1 DOWNTO 0);SIGNAL dataout_a_reg            :  STD_LOGIC_VECTOR(port_a_data_width - 1 DOWNTO 0);SIGNAL dataout_a                :  STD_LOGIC_VECTOR(port_a_data_width - 1 DOWNTO 0);SIGNAL byteena_a_reg            :  STD_LOGIC_VECTOR(port_a_byte_enable_mask_width- 1 DOWNTO 0);-- port B registersSIGNAL rewe_b_reg               :  STD_LOGIC;SIGNAL rewe_b_reg_in,rewe_b_reg_out :  one_bit_bus_type;SIGNAL addr_b_reg               :  STD_LOGIC_VECTOR(port_b_address_width - 1 DOWNTO 0);SIGNAL datain_b_reg             :  STD_LOGIC_VECTOR(port_b_data_width - 1 DOWNTO 0);SIGNAL dataout_b_reg            :  STD_LOGIC_VECTOR(port_b_data_width - 1 DOWNTO 0);SIGNAL dataout_b                :  STD_LOGIC_VECTOR(port_b_data_width - 1 DOWNTO 0);SIGNAL byteena_b_reg            :  STD_LOGIC_VECTOR(port_b_byte_enable_mask_width- 1 DOWNTO 0);-- pulsesTYPE   pulse_vec IS ARRAY (port_type'HIGH DOWNTO port_type'LOW) OF STD_LOGIC;SIGNAL write_pulse,read_pulse,read_pulse_feedthru : pulse_vec;SIGNAL wpgen_a_clk,wpgen_a_clkena,wpgen_b_clk,wpgen_b_clkena : STD_LOGIC;SIGNAL rpgen_a_clkena,rpgen_b_clkena : STD_LOGIC;SIGNAL ftpgen_a_clkena,ftpgen_b_clkena : STD_LOGIC;-- registered addressSIGNAL addr_prime_reg,addr_sec_reg :  INTEGER;-- input/outputSIGNAL datain_prime_reg,dataout_prime     :  STD_LOGIC_VECTOR(data_width - 1 DOWNTO 0);SIGNAL datain_sec_reg,dataout_sec         :  STD_LOGIC_VECTOR(data_unit_width - 1 DOWNTO 0);--  overlapping location writeSIGNAL dual_write : BOOLEAN;-- memory coreSUBTYPE  mem_word_type IS STD_LOGIC_VECTOR (data_width - 1 DOWNTO 0);SUBTYPE  mem_col_type  IS STD_LOGIC_VECTOR (data_unit_width - 1 DOWNTO 0);TYPE     mem_row_type  IS ARRAY (num_cols - 1 DOWNTO 0) OF mem_col_type;TYPE     mem_type IS ARRAY ((2 ** address_unit_width) - 1 DOWNTO 0) OF mem_row_type;SIGNAL   mem : mem_type;SIGNAL   init_mem : BOOLEAN := FALSE;CONSTANT mem_x : mem_type     := (OTHERS => (OTHERS => (OTHERS => 'X')));CONSTANT row_x : mem_row_type := (OTHERS => (OTHERS => 'X'));CONSTANT col_x : mem_col_type := (OTHERS => 'X');SIGNAL   mem_data : mem_row_type;SIGNAL   mem_unit_data : mem_col_type;-- latchesTYPE   read_latch_rec IS RECORD       prime : mem_row_type;       sec   : mem_col_type;END RECORD;SIGNAL read_latch      :  read_latch_rec;-- (row,column) coordinatesSIGNAL row_sec,col_sec  : INTEGER;-- byte enableTYPE   mask_type IS (normal,inverse);TYPE   mask_prime_type IS ARRAY(mask_type'HIGH DOWNTO mask_type'LOW) OF mem_word_type;TYPE   mask_sec_type   IS ARRAY(mask_type'HIGH DOWNTO mask_type'LOW) OF mem_col_type;TYPE   mask_rec IS RECORD       prime : mask_prime_type;       sec   : mask_sec_type;END RECORD;SIGNAL mask_vector : mask_rec;SIGNAL mask_vector_common : mem_col_type;FUNCTION get_mask(    b_ena : IN STD_LOGIC_VECTOR;    mode  : port_type;    CONSTANT b_ena_width ,byte_size: INTEGER) RETURN mask_rec ISVARIABLE l : INTEGER;VARIABLE mask : mask_rec := (                                (normal => (OTHERS => '0'),inverse => (OTHERS => 'X')),                                (normal => (OTHERS => '0'),inverse => (OTHERS => 'X'))                            );BEGIN    FOR l in 0 TO b_ena_width - 1  LOOP        IF (b_ena(l) = '0') THEN            IF (mode = primary) THEN                mask.prime(normal) ((l+1)*byte_size - 1 DOWNTO l*byte_size) := (OTHERS => 'X');                mask.prime(inverse)((l+1)*byte_size - 1 DOWNTO l*byte_size) := (OTHERS => '0');            ELSE                mask.sec(normal) ((l+1)*byte_size - 1 DOWNTO l*byte_size) := (OTHERS => 'X');                mask.sec(inverse)((l+1)*byte_size - 1 DOWNTO l*byte_size) := (OTHERS => '0');            END IF;        ELSIF (b_ena(l) = 'X' OR b_ena(l) = 'U') THEN            IF (mode = primary) THEN                mask.prime(normal) ((l+1)*byte_size - 1 DOWNTO l*byte_size) := (OTHERS => 'X');            ELSE                mask.sec(normal) ((l+1)*byte_size - 1 DOWNTO l*byte_size) := (OTHERS => 'X');            END IF;        END IF;    END LOOP;    RETURN mask;END get_mask;-- port active for read/writeSIGNAL active_a_in_vec,active_b_in_vec,active_a_out,active_b_out : one_bit_bus_type;SIGNAL active_a_in,active_b_in   : STD_LOGIC;SIGNAL active_a,active_write_a :  BOOLEAN;SIGNAL active_b,active_write_b :  BOOLEAN;SIGNAL wire_vcc : STD_LOGIC := '1';SIGNAL wire_gnd : STD_LOGIC := '0';BEGIN    -- memory initialization    init_mem <= TRUE;    -- -------- core logic ---------------    clk_a_in      <= clk0;    clk_a_byteena <= '0'   WHEN (port_a_byte_enable_clock = "none" OR port_a_byte_enable_clock = "UNUSED") ELSE clk_a_in;    clk_a_out     <= '0'   WHEN (port_a_data_out_clock = "none" OR port_a_data_out_clock = "UNUSED")    ELSE                      clk0 WHEN (port_a_data_out_clock = "clock0")  ELSE clk1;    clk_b_in      <=  clk0 WHEN (port_b_read_enable_write_enable_clock = "clock0") ELSE clk1;    clk_b_byteena <=  '0'  WHEN (port_b_byte_enable_clock = "none" OR port_b_byte_enable_clock = "UNUSED") ELSE                      clk0 WHEN (port_b_byte_enable_clock = "clock0") ELSE clk1;    clk_b_out     <=  '0'  WHEN (port_b_data_out_clock = "none" OR port_b_data_out_clock = "UNUSED")    ELSE                      clk0 WHEN (port_b_data_out_clock = "clock0")  ELSE clk1;    addr_a_clr_in <=  '0'  WHEN (port_a_address_clear = "none" OR port_a_address_clear = "UNUSED") ELSE clr0;    addr_b_clr_in <=  '0'  WHEN (port_b_address_clear = "none" OR port_b_address_clear = "UNUSED") ELSE                      clr0 WHEN (port_b_address_clear = "clear0") ELSE clr1;    datain_a_clr_in <= '0' WHEN (port_a_data_in_clear = "none" OR port_a_data_in_clear = "UNUSED") ELSE clr0;    datain_b_clr_in <= '0' WHEN (port_b_data_in_clear = "none" OR port_b_data_in_clear = "UNUSED") ELSE                      clr0 WHEN (port_b_data_in_clear = "clear0") ELSE clr1;    dataout_a_clr   <= '0' WHEN (port_a_data_out_clear = "none" OR port_a_data_out_clear = "UNUSED")   ELSE                      clr0 WHEN (port_a_data_out_clear = "clear0") ELSE clr1;    dataout_b_clr   <= '0' WHEN (port_b_data_out_clear = "none" OR port_b_data_out_clear = "UNUSED")   ELSE                      clr0 WHEN (port_b_data_out_clear = "clear0") ELSE clr1;    byteena_a_clr_in <= '0' WHEN (port_a_byte_enable_clear = "none" OR port_a_byte_enable_clear = "UNUSED") ELSE clr0;    byteena_b_clr_in <= '0' WHEN (port_b_byte_enable_clear = "none" OR port_b_byte_enable_clear = "UNUSED") ELSE                       clr0 WHEN (port_b_byte_enable_clear = "clear0") ELSE clr1;    we_a_clr_in      <= '0' WHEN (port_a_write_enable_clear = "none" OR port_a_write_enable_clear = "UNUSED") ELSE clr0;    rewe_b_clr_in    <= '0' WHEN (port_b_read_enable_write_enable_clear = "none" OR port_b_read_enable_write_enable_clear = "UNUSED")   ELSE                       clr0 WHEN (port_b_read_enable_write_enable_clear = "clear0") ELSE clr1;        active_a_in <= '1'  WHEN (port_a_disable_ce_on_input_registers = "on") ELSE ena0;        active_b_in <= '1'  WHEN (port_b_disable_ce_on_input_registers = "on") ELSE 

⌨️ 快捷键说明

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