📄 orca_ecmem.vhd
字号:
END LOOP; FOR i IN 0 TO 8 LOOP MEM((WADDR_A * DATA_WIDTH_A) + i + 9) <= dia_reg(i + 9); END LOOP; END IF; ELSIF (DATA_WIDTH_A = 9) 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 (DATA_WIDTH_A - 1) LOOP MEM((WADDR_A * DATA_WIDTH_A) + i) <= dia_reg(i); END LOOP; END IF; ELSE 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 (DATA_WIDTH_A - 1) LOOP MEM((WADDR_A * DATA_WIDTH_A) + (WADDR_A / div_a) + i) <= dia_reg(i); END LOOP; END IF; END IF; IF (DATA_WIDTH_B = 18) THEN IF (wrenb_reg = '1' and clkb_valid = '1') THEN FOR i IN 0 TO (DATA_WIDTH_B - 1) LOOP dob_node_rbr(i) <= MEM((WADDR_B * DATA_WIDTH_B) + (WADDR_B / div_b) + i); END LOOP; FOR i IN 0 TO 8 LOOP MEM((WADDR_B * DATA_WIDTH_B) + i) <= dib_reg(i); END LOOP; FOR i IN 0 TO 8 LOOP MEM((WADDR_B * DATA_WIDTH_B) + i + 9) <= dib_reg(i + 9); END LOOP; END IF; ELSIF (DATA_WIDTH_B = 9) THEN IF (wrenb_reg = '1' and clkb_valid = '1') THEN FOR i IN 0 TO (DATA_WIDTH_B - 1) LOOP dob_node_rbr(i) <= MEM((WADDR_B * DATA_WIDTH_B) + (WADDR_B / div_b) + i); END LOOP; FOR i IN 0 TO (DATA_WIDTH_B - 1) LOOP MEM((WADDR_B * DATA_WIDTH_B) + i) <= dib_reg(i); END LOOP; END IF; ELSE IF (wrenb_reg = '1' and clkb_valid = '1') THEN FOR i IN 0 TO (DATA_WIDTH_B - 1) LOOP dob_node_rbr(i) <= MEM((WADDR_B * DATA_WIDTH_B) + (WADDR_B / div_b) + i); END LOOP; FOR i IN 0 TO (DATA_WIDTH_B - 1) LOOP MEM((WADDR_B * DATA_WIDTH_B) + (WADDR_B / div_b) + i) <= dib_reg(i); END LOOP; END IF; END IF; END IF; END PROCESS; P9 : PROCESS(ada_reg, rena_reg, adb_reg, renb_reg, MEM, clka_valid1, clkb_valid1, rsta_sig, rstb_sig, doa_node_rbr, dob_node_rbr) VARIABLE RADDR_A_VALID : boolean := TRUE; VARIABLE RADDR_B_VALID : boolean := TRUE; VARIABLE RADDR_A : integer := 0; VARIABLE RADDR_B : integer := 0; VARIABLE dout_node_tr : std_logic_vector(35 downto 0); VARIABLE dout_node_wt : std_logic_vector(35 downto 0); BEGIN RADDR_A_VALID := Valid_Address (ada_reg); RADDR_B_VALID := Valid_Address (adb_reg); IF (RADDR_A_VALID = TRUE) THEN RADDR_A := conv_integer(ada_reg); END IF; IF (RADDR_B_VALID = TRUE) THEN RADDR_B := conv_integer(adb_reg); END IF; IF (DATA_WIDTH_B = 36) THEN IF (rstb_sig = '1') THEN IF (RESETMODE = "SYNC") THEN IF (clkb_ipd = '1') THEN doa_node <= (others => '0'); dob_node <= (others => '0'); END IF; ELSIF (RESETMODE = "ASYNC") THEN doa_node <= (others => '0'); dob_node <= (others => '0'); END IF; ELSIF (clkb_valid1'event and clkb_valid1 = '1') THEN IF (renb_reg = '1') THEN FOR i IN 0 TO (DATA_WIDTH_B - 1) LOOP dout_node_tr(i) := MEM((RADDR_B * DATA_WIDTH_B) + i); END LOOP; doa_node <= dout_node_tr(17 downto 0); dob_node <= dout_node_tr(35 downto 18); ELSIF (renb_reg = '0') THEN IF (WRITEMODE_B = "WRITETHROUGH") THEN FOR i IN 0 TO (DATA_WIDTH_B - 1) LOOP dout_node_wt(i) := MEM((RADDR_B * DATA_WIDTH_B) + i); END LOOP; doa_node <= dout_node_wt(17 downto 0); dob_node <= dout_node_wt(35 downto 18); ELSIF (WRITEMODE_B = "READBEFOREWRITE") THEN doa_node <= doa_node_rbr; dob_node <= dob_node_rbr; END IF; END IF; END IF; ELSE IF (rsta_sig = '1') THEN IF (RESETMODE = "SYNC") THEN IF (clka_ipd = '1') THEN doa_node <= (others => '0'); END IF; ELSIF (RESETMODE = "ASYNC") THEN doa_node <= (others => '0'); END IF; ELSIF (clka_valid1'event and clka_valid1 = '1') THEN IF (rena_reg = '1') THEN FOR i IN 0 TO (DATA_WIDTH_A - 1) LOOP doa_node(i) <= MEM((RADDR_A * DATA_WIDTH_A) + (RADDR_A / div_a) + i); END LOOP; ELSIF (rena_reg = '0') THEN IF (WRITEMODE_A = "WRITETHROUGH") THEN FOR i IN 0 TO (DATA_WIDTH_A - 1) LOOP doa_node(i) <= MEM((RADDR_A * DATA_WIDTH_A) + (RADDR_A / div_a) + i); END LOOP; ELSIF (WRITEMODE_A = "READBEFOREWRITE") THEN doa_node <= doa_node_rbr; END IF; END IF; END IF; IF (rstb_sig = '1') THEN IF (RESETMODE = "SYNC") THEN IF (clkb_ipd = '1') THEN dob_node <= (others => '0'); END IF; ELSIF (RESETMODE = "ASYNC") THEN dob_node <= (others => '0'); END IF; ELSIF (clkb_valid1'event and clkb_valid1 = '1') THEN IF (renb_reg = '1') THEN FOR i IN 0 TO (DATA_WIDTH_B - 1) LOOP dob_node(i) <= MEM((RADDR_B * DATA_WIDTH_B) + (RADDR_B / div_b) + i); END LOOP; ELSIF (renb_reg = '0') THEN IF (WRITEMODE_B = "WRITETHROUGH") THEN FOR i IN 0 TO (DATA_WIDTH_B - 1) LOOP dob_node(i) <= MEM((RADDR_B * DATA_WIDTH_B) + (RADDR_B / div_b) + i); END LOOP; ELSIF (WRITEMODE_B = "READBEFOREWRITE") THEN dob_node <= dob_node_rbr; END IF; END IF; END IF; END IF; END PROCESS; P10 : PROCESS(g_reset, rsta_ipd, rstb_ipd, clka_ipd, clkb_ipd) BEGIN IF (g_reset = '0') THEN doa_reg <= (others => '0'); ELSIF (RESETMODE = "ASYNC") THEN IF (rsta_ipd = '1') THEN doa_reg <= (others => '0'); ELSIF (clka_ipd'event and clka_ipd = '1') THEN IF (cea_ipd = '1') THEN doa_reg <= doa_node; END IF; END IF; ELSIF (RESETMODE = "SYNC") THEN IF (clka_ipd'event and clka_ipd = '1') THEN IF (cea_ipd = '1') THEN IF (rsta_ipd = '1') THEN doa_reg <= (others => '0'); ELSIF (rsta_ipd = '0') THEN doa_reg <= doa_node; END IF; END IF; END IF; END IF; IF (g_reset = '0') THEN dob_reg <= (others => '0'); doab_reg <= (others => '0'); ELSIF (RESETMODE = "ASYNC") THEN IF (rstb_ipd = '1') THEN dob_reg <= (others => '0'); doab_reg <= (others => '0'); ELSIF (clkb_ipd'event and clkb_ipd = '1') THEN IF (ceb_ipd = '1') THEN dob_reg <= dob_node; doab_reg <= doa_node; END IF; END IF; ELSIF (RESETMODE = "SYNC") THEN IF (clkb_ipd'event and clkb_ipd = '1') THEN IF (ceb_ipd = '1') THEN IF (rstb_ipd = '1') THEN dob_reg <= (others => '0'); doab_reg <= (others => '0'); ELSIF (rstb_ipd = '0') THEN dob_reg <= dob_node; doab_reg <= doa_node; END IF; END IF; END IF; END IF; END PROCESS; P11 : PROCESS(doa_node, dob_node, doa_reg, dob_reg, doab_reg) BEGIN IF (REGMODE_A = "OUTREG") THEN IF (DATA_WIDTH_B = 36) THEN doa_int <= doab_reg; ELSE doa_int <= doa_reg; END IF; ELSE doa_int <= doa_node; END IF; IF (REGMODE_B = "OUTREG") THEN dob_int <= dob_reg; ELSE dob_int <= dob_node; END IF; END PROCESS; (doa17, doa16, doa15, doa14, doa13, doa12, doa11, doa10, doa9, doa8, doa7, doa6, doa5, doa4, doa3, doa2, doa1, doa0) <= doa_int; (dob17, dob16, dob15, dob14, dob13, dob12, dob11, dob10, dob9, dob8, dob7, dob6, dob5, dob4, dob3, dob2, dob1, dob0) <= dob_int;END V;-------cell sp8ka------library ieee;use ieee.std_logic_1164.all;use ieee.vital_timing.all;use ieee.vital_primitives.all;library ec; use ec.global.gsrnet;use ec.global.purnet;use ec.mem3.all;-- entity declaration --ENTITY sp8ka IS GENERIC ( DATA_WIDTH : Integer := 18; REGMODE : String := "NOREG"; RESETMODE : String := "ASYNC"; CSDECODE : String := "000"; WRITEMODE : String := "NORMAL"; GSR : String := "ENABLED"; initval_00 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_01 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_02 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_03 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_04 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_05 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_06 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_07 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_08 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_09 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_0a : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_0b : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_0c : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_0d : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_0e : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_0f : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_10 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_11 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_12 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_13 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_14 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_15 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_16 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_17 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_18 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_19 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_1a : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_1b : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_1c : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_1d : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_1e : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_1f : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"); PORT( di0, di1, di2, di3, di4, di5, di6, di7, di8 : in std_logic := 'X'; di9, di10, di11, di12, di13, di14, di15, di16, di17 : in std_logic := 'X';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -