📄 orca_ecmem.vhd
字号:
csa_en <= '1'; ELSIF (csa_ipd = "101" and CSDECODE_A = "101") THEN csa_en <= '1'; ELSIF (csa_ipd = "110" and CSDECODE_A = "110") THEN csa_en <= '1'; ELSIF (csa_ipd = "111" and CSDECODE_A = "111") THEN csa_en <= '1'; ELSE csa_en <= '0'; END IF; END PROCESS; P2 : PROCESS(csb_ipd) BEGIN IF (csb_ipd = "000" and CSDECODE_B = "000") THEN csb_en <= '1'; ELSIF (csb_ipd = "001" and CSDECODE_B = "001") THEN csb_en <= '1'; ELSIF (csb_ipd = "010" and CSDECODE_B = "010") THEN csb_en <= '1'; ELSIF (csb_ipd = "011" and CSDECODE_B = "011") THEN csb_en <= '1'; ELSIF (csb_ipd = "100" and CSDECODE_B = "100") THEN csb_en <= '1'; ELSIF (csb_ipd = "101" and CSDECODE_B = "101") THEN csb_en <= '1'; ELSIF (csb_ipd = "110" and CSDECODE_B = "110") THEN csb_en <= '1'; ELSIF (csb_ipd = "111" and CSDECODE_B = "111") THEN csb_en <= '1'; ELSE csb_en <= '0'; END IF; END PROCESS; P3 : PROCESS(dia_ipd) BEGIN CASE DATA_WIDTH_A IS WHEN 1 => dia_node <= dia_ipd(11 downto 11); WHEN 2 => dia_node <= (dia_ipd(1), dia_ipd(11)); WHEN 4 => dia_node <= dia_ipd(3 downto 0); WHEN 9 => dia_node <= dia_ipd(8 downto 0); WHEN 18 => dia_node <= dia_ipd; WHEN 36 => dia_node <= dia_ipd; WHEN others => NULL; END CASE; END PROCESS; P4 : PROCESS(dib_ipd) BEGIN CASE DATA_WIDTH_B IS WHEN 1 => dib_node <= dib_ipd(11 downto 11); WHEN 2 => dib_node <= (dib_ipd(1), dib_ipd(11)); WHEN 4 => dib_node <= dib_ipd(3 downto 0); WHEN 9 => dib_node <= dib_ipd(8 downto 0); WHEN 18 => dib_node <= dib_ipd; WHEN 36 => dib_node <= dib_ipd; WHEN others => NULL; END CASE; END PROCESS; diab_node <= (dib_ipd & dia_ipd); P107 : PROCESS(clka_ipd) BEGIN IF (clka_ipd'event and clka_ipd = '1' and clka_ipd'last_value = '0') THEN IF ((g_reset = '0') or (rsta_ipd = '1')) THEN clka_valid <= '0'; ELSE IF (cea_ipd = '1') THEN IF (csa_en = '1') THEN clka_valid <= '1', '0' after 0.01 ns; ELSE clka_valid <= '0'; END IF; ELSE clka_valid <= '0'; END IF; END IF; END IF; END PROCESS; P108 : PROCESS(clkb_ipd) BEGIN IF (clkb_ipd'event and clkb_ipd = '1' and clkb_ipd'last_value = '0') THEN IF ((g_reset = '0') or (rstb_ipd = '1')) THEN clkb_valid <= '0'; ELSE IF (ceb_ipd = '1') THEN IF (csb_en = '1') THEN clkb_valid <= '1', '0' after 0.01 ns; ELSE clkb_valid <= '0'; END IF; ELSE clkb_valid <= '0'; END IF; END IF; END IF; END PROCESS; clka_valid1 <= clka_valid; clkb_valid1 <= clkb_valid; P7 : PROCESS(g_reset, rsta_ipd, rstb_ipd, clka_ipd, clkb_ipd) BEGIN IF (g_reset = '0') THEN dia_reg <= (others => '0'); diab_reg <= (others => '0'); ada_reg <= (others => '0'); wrena_reg <= '0'; rena_reg <= '0'; ELSIF (RESETMODE = "ASYNC") THEN IF (rsta_ipd = '1') THEN dia_reg <= (others => '0'); diab_reg <= (others => '0'); ada_reg <= (others => '0'); wrena_reg <= '0'; rena_reg <= '0'; ELSIF (clka_ipd'event and clka_ipd = '1') THEN IF (cea_ipd = '1') THEN dia_reg <= dia_node; diab_reg <= diab_node; ada_reg <= ada_node; wrena_reg <= (wrea_ipd and csa_en); rena_reg <= ((not wrea_ipd) and csa_en); END IF; END IF; ELSIF (RESETMODE = "SYNC") THEN IF (clka_ipd'event and clka_ipd = '1') THEN IF (rsta_ipd = '1') THEN dia_reg <= (others => '0'); diab_reg <= (others => '0'); ada_reg <= (others => '0'); wrena_reg <= '0'; rena_reg <= '0'; ELSIF (cea_ipd = '1') THEN dia_reg <= dia_node; diab_reg <= diab_node; ada_reg <= ada_node; wrena_reg <= (wrea_ipd and csa_en); rena_reg <= ((not wrea_ipd) and csa_en); END IF; END IF; END IF; IF (g_reset = '0') THEN dib_reg <= (others => '0'); adb_reg <= (others => '0'); wrenb_reg <= '0'; renb_reg <= '0'; ELSIF (RESETMODE = "ASYNC") THEN IF (rstb_ipd = '1') THEN dib_reg <= (others => '0'); adb_reg <= (others => '0'); wrenb_reg <= '0'; renb_reg <= '0'; ELSIF (clkb_ipd'event and clkb_ipd = '1') THEN IF (ceb_ipd = '1') THEN dib_reg <= dib_node; adb_reg <= adb_node; wrenb_reg <= (wreb_ipd and csb_en); renb_reg <= ((not wreb_ipd) and csb_en); END IF; END IF; ELSIF (RESETMODE = "SYNC") THEN IF (clkb_ipd'event and clkb_ipd = '1') THEN IF (rstb_ipd = '1') THEN dib_reg <= (others => '0'); adb_reg <= (others => '0'); wrenb_reg <= '0'; renb_reg <= '0'; ELSIF (ceb_ipd = '1') THEN dib_reg <= dib_node; adb_reg <= adb_node; wrenb_reg <= (wreb_ipd and csb_en); renb_reg <= ((not wreb_ipd) and csb_en); END IF; END IF; END IF; END PROCESS;-- Warning for collision PW : PROCESS(ada_reg, adb_reg, wrena_reg, wrenb_reg, clka_valid, clkb_valid, rena_reg, renb_reg) VARIABLE WADDR_A_VALID : boolean := TRUE; VARIABLE WADDR_B_VALID : boolean := TRUE; VARIABLE ADDR_A : integer := 0; VARIABLE ADDR_B : integer := 0; VARIABLE DN_ADDR_A : integer := 0; VARIABLE UP_ADDR_A : integer := 0; VARIABLE DN_ADDR_B : integer := 0; VARIABLE UP_ADDR_B : integer := 0; BEGIN WADDR_A_VALID := Valid_Address (ada_reg); WADDR_B_VALID := Valid_Address (adb_reg); IF (WADDR_A_VALID = TRUE) THEN ADDR_A := conv_integer(ada_reg); END IF; IF (WADDR_B_VALID = TRUE) THEN ADDR_B := conv_integer(adb_reg); END IF; DN_ADDR_A := (ADDR_A * DATA_WIDTH_A); UP_ADDR_A := (((ADDR_A + 1) * DATA_WIDTH_A) - 1); DN_ADDR_B := (ADDR_B * DATA_WIDTH_B); UP_ADDR_B := (((ADDR_B + 1) * DATA_WIDTH_B) - 1); IF ((wrena_reg = '1' and clka_valid = '1') and (wrenb_reg = '1' and clkb_valid = '1')) THEN IF (not((UP_ADDR_B <= DN_ADDR_A) or (DN_ADDR_B >= UP_ADDR_A))) THEN assert false report " Write collision! Writing in the same memory location using Port A and Port B will cause the memory content invalid." severity error; END IF; END IF;-- IF ((wrena_reg = '1' and clka_valid = '1') and (renb_reg = '1' and clkb_valid = '1')) THEN -- IF (not((UP_ADDR_B <= DN_ADDR_A) or (DN_ADDR_B >= UP_ADDR_A))) THEN-- assert false-- report " Write/Read collision! Writing through Port A and reading through Port B from the same memory location may give wrong output."-- severity warning;-- END IF;-- END IF;-- IF ((rena_reg = '1' and clka_valid = '1') and (wrenb_reg = '1' and clkb_valid = '1')) THEN -- IF (not((UP_ADDR_A <= DN_ADDR_B) or (DN_ADDR_A >= UP_ADDR_B))) THEN-- assert false-- report " Write/Read collision! Writing through Port B and reading through Port A from the same memory location may give wrong output."-- severity warning;-- END IF;-- END IF; END PROCESS;-- Writing to the memory P8 : PROCESS(ada_reg, dia_reg, diab_reg, wrena_reg, dib_reg, adb_reg, wrenb_reg, clka_valid, clkb_valid) VARIABLE WADDR_A_VALID : boolean := TRUE; VARIABLE WADDR_B_VALID : boolean := TRUE; VARIABLE WADDR_A : integer := 0; VARIABLE WADDR_B : integer := 0; VARIABLE dout_node_rbr : std_logic_vector(35 downto 0); BEGIN WADDR_A_VALID := Valid_Address (ada_reg); WADDR_B_VALID := Valid_Address (adb_reg); IF (WADDR_A_VALID = TRUE) THEN WADDR_A := conv_integer(ada_reg); END IF; IF (WADDR_B_VALID = TRUE) THEN WADDR_B := conv_integer(adb_reg); END IF; IF (DATA_WIDTH_A = 36) THEN IF (wrena_reg = '1' and clka_valid = '1') THEN FOR i IN 0 TO (DATA_WIDTH_A - 1) LOOP dout_node_rbr(i) := MEM((WADDR_A * DATA_WIDTH_A) + i); END LOOP; doa_node_rbr <= dout_node_rbr(17 downto 0); dob_node_rbr <= dout_node_rbr(35 downto 18); FOR i IN 0 TO 8 LOOP MEM((WADDR_A * DATA_WIDTH_A) + i) <= diab_reg(i); END LOOP; FOR i IN 0 TO 8 LOOP MEM((WADDR_A * DATA_WIDTH_A) + i + 9) <= diab_reg(i + 9); END LOOP; FOR i IN 0 TO 8 LOOP MEM((WADDR_A * DATA_WIDTH_A) + i + 18) <= diab_reg(i + 18); END LOOP; FOR i IN 0 TO 8 LOOP MEM((WADDR_A * DATA_WIDTH_A) + i + 27) <= diab_reg(i + 27); END LOOP; END IF; ELSE IF (DATA_WIDTH_A = 18) THEN IF (wrena_reg = '1' and clka_valid = '1') THEN FOR i IN 0 TO (DATA_WIDTH_A - 1) LOOP doa_node_rbr(i) <= MEM((WADDR_A * DATA_WIDTH_A) + (WADDR_A / div_a) + i); END LOOP; FOR i IN 0 TO 8 LOOP MEM((WADDR_A * DATA_WIDTH_A) + i) <= dia_reg(i);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -