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

📄 orca_ecmem.vhd

📁 free hardware ip core about sparcv8,a soc cpu in vhdl
💻 VHD
📖 第 1 页 / 共 5 页
字号:
        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 + -