📄 ecp2_misc.vhd
字号:
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') 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.2 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; last_clka_valid1 <= clka_valid1; last_clkb_valid1 <= clkb_valid1; 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'); bwa0_reg <= (others => '0'); bwa1_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'); bwa0_reg <= (others => '0'); bwa1_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; bwa0_reg <= (ada_ipd(1), ada_ipd(0)); bwa1_reg <= (ada_ipd(3), ada_ipd(2)); 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'); bwa0_reg <= (others => '0'); bwa1_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; bwa0_reg <= (ada_ipd(1), ada_ipd(0)); bwa1_reg <= (ada_ipd(3), ada_ipd(2)); 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'); bwb_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'); bwb_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; bwb_reg <= (adb_ipd(1), adb_ipd(0)); 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'); bwb_reg <= (others => '0'); wrenb_reg <= '0'; renb_reg <= '0'; ELSIF (ceb_ipd = '1') THEN dib_reg <= dib_node; adb_reg <= adb_node; bwb_reg <= (adb_ipd(1), adb_ipd(0)); 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); DN_ADDR_A := (ADDR_A * DATA_WIDTH_A) + (ADDR_A / div_a); UP_ADDR_A := DN_ADDR_A + (DATA_WIDTH_A - 1); DN_ADDR_B := (ADDR_B * DATA_WIDTH_B) + (ADDR_B / div_b); UP_ADDR_B := DN_ADDR_B + (DATA_WIDTH_B - 1); IF (not((UP_ADDR_B < DN_ADDR_A) or (DN_ADDR_B > UP_ADDR_A))) THEN IF (wr_a_wr_b_coll = '1') THEN IF (clka_valid = '0' and clkb_valid = '0') THEN wr_a_wr_b_coll <= '0'; END IF; END IF; ELSE wr_a_wr_b_coll <= '0'; END IF; IF (not((UP_ADDR_B < DN_ADDR_A) or (DN_ADDR_B > UP_ADDR_A))) THEN IF (wr_a_rd_b_coll = '1') THEN IF (clka_valid = '0' and clkb_valid = '0') THEN wr_a_rd_b_coll <= '0'; END IF; END IF; ELSE wr_a_rd_b_coll <= '0'; END IF; IF (not((UP_ADDR_A < DN_ADDR_B) or (DN_ADDR_A > UP_ADDR_B))) THEN IF (rd_a_wr_b_coll = '1') THEN IF (clka_valid = '0' and clkb_valid = '0') THEN rd_a_wr_b_coll <= '0'; END IF; END IF; ELSE rd_a_wr_b_coll <= '0'; END IF; if (not((UP_ADDR_B < DN_ADDR_A) or (DN_ADDR_B > UP_ADDR_A))) then if ((DN_ADDR_A > DN_ADDR_B) and (UP_ADDR_A < UP_ADDR_B)) then dn_coll_addr <= DN_ADDR_A; up_coll_addr <= UP_ADDR_A; elsif ((DN_ADDR_B > DN_ADDR_A) and (UP_ADDR_B < UP_ADDR_A)) then dn_coll_addr <= DN_ADDR_B; up_coll_addr <= UP_ADDR_B; elsif ((UP_ADDR_A - DN_ADDR_B) <= (UP_ADDR_B - DN_ADDR_A)) then dn_coll_addr <= DN_ADDR_B; up_coll_addr <= UP_ADDR_A; else dn_coll_addr <= DN_ADDR_A; up_coll_addr <= UP_ADDR_B; end if; end if; 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 warning; wr_a_wr_b_coll <= '1'; 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; wr_a_rd_b_coll <= '1'; 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; rd_a_wr_b_coll <= '1'; END IF; END IF; END PROCESS;-- Writing to the memory P8 : PROCESS(ada_reg, dia_reg, diab_reg, bwa0_reg, bwa1_reg, wrena_reg, dib_reg, adb_reg, bwb_reg, wrenb_reg, clka_valid, clkb_valid, wr_a_wr_b_coll) 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); IF (bwa0_reg(0) = '1') THEN FOR i IN 0 TO 8 LOOP MEM((WADDR_A * DATA_WIDTH_A) + i) <= diab_reg(i); END LOOP; END IF; IF (bwa0_reg(1) = '1') THEN FOR i IN 0 TO 8 LOOP MEM((WADDR_A * DATA_WIDTH_A) + i + 9) <= diab_reg(i + 9); END LOOP; END IF;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -