📄 cy7c1354b.vhd
字号:
REPORT "Addr - tAH violation" SEVERITY ERROR; END IF; IF Clk'DELAYED(tCENH) = '1' THEN ASSERT (CEN_n'LAST_EVENT > tCENH) REPORT "CKE# - tCENH violation" SEVERITY ERROR; END IF; --IF Clk'DELAYED(tDH) = '1' THEN -- ASSERT (Dq'LAST_EVENT > tDH) -- REPORT "Dq - tDH violation" -- SEVERITY ERROR; --END IF; IF Clk'DELAYED(tWEH) = '1' THEN ASSERT (Ce1_n'LAST_EVENT > tWEH) REPORT "CE1# - tWEH violation" SEVERITY ERROR; ASSERT (Ce2'LAST_EVENT > tWEH) REPORT "CE2 - tWEH violation" SEVERITY ERROR; ASSERT (Ce3_n'LAST_EVENT > tWEH) REPORT "CE3 - tWEH violation" SEVERITY ERROR; ASSERT (AdvLd_n'LAST_EVENT > tWEH) REPORT "ADV/LD# - tWEH violation" SEVERITY ERROR; ASSERT (Rw_n'LAST_EVENT > tWEH) REPORT "RW# - tWEH violation" SEVERITY ERROR; ASSERT (Bwa_n'LAST_EVENT > tWEH) REPORT "BWa# - tWEH violation" SEVERITY ERROR; ASSERT (Bwb_n'LAST_EVENT > tWEH) REPORT "BWb# - tWEH violation" SEVERITY ERROR; ASSERT (Bwc_n'LAST_EVENT > tWEH) REPORT "BWc# - tWEH violation" SEVERITY ERROR; ASSERT (Bwd_n'LAST_EVENT > tWEH) REPORT "BWd# - tWEH violation" SEVERITY ERROR; END IF; END PROCESS; -- Main Program main : PROCESS -- TYPE memory_array IS ARRAY ((2**addr_bits) - 1 DOWNTO 0) OF STD_LOGIC_VECTOR ((data_bits / 4) - 1 DOWNTO 0); TYPE memory_array IS ARRAY (0 TO (2**addr_bits) - 1) OF STD_LOGIC_VECTOR ((data_bits / 4) - 1 DOWNTO 0); VARIABLE Addr_in : STD_LOGIC_VECTOR ((addr_bits - 1) DOWNTO 0) := (OTHERS => '0'); VARIABLE first_Addr : STD_LOGIC_VECTOR (1 DOWNTO 0) := (OTHERS => '0'); VARIABLE Addr_read : STD_LOGIC_VECTOR ((addr_bits - 1) DOWNTO 0) := (OTHERS => '0'); VARIABLE Addr_write : STD_LOGIC_VECTOR ((addr_bits - 1) DOWNTO 0) := (OTHERS => '0'); VARIABLE bAddr0, bAddr1 : STD_LOGIC := '0'; VARIABLE bank0 : memory_array; VARIABLE bank1 : memory_array; VARIABLE bank2 : memory_array; VARIABLE bank3 : memory_array; VARIABLE ce_in : STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; VARIABLE rw_in : STD_LOGIC_VECTOR (2 DOWNTO 0) := "111"; VARIABLE bwa_in : STD_LOGIC_VECTOR (2 DOWNTO 0) := "000"; VARIABLE bwb_in : STD_LOGIC_VECTOR (2 DOWNTO 0) := "000"; VARIABLE bwc_in : STD_LOGIC_VECTOR (2 DOWNTO 0) := "000"; VARIABLE bwd_in : STD_LOGIC_VECTOR (2 DOWNTO 0) := "000"; VARIABLE bcnt : STD_LOGIC_VECTOR (1 DOWNTO 0) := "00"; variable FIRST : boolean := true; file TCF : text open read_mode is fname; variable rectype : std_logic_vector(3 downto 0); variable recaddr : std_logic_vector(31 downto 0); variable reclen : std_logic_vector(7 downto 0); variable recdata : std_logic_vector(0 to 16*8-1); variable CH : character; variable ai : integer := 0; variable L1 : line; BEGIN if FIRST then L1:= new string'(""); while not endfile(TCF) loop readline(TCF,L1); if (L1'length /= 0) then while (not (L1'length=0)) and (L1(L1'left) = ' ') loop std.textio.read(L1,CH); end loop; if L1'length > 0 then std.textio.read(L1, ch); if (ch = 'S') or (ch = 's') then hexread(L1, rectype); hexread(L1, reclen); recaddr := (others => '0'); case rectype is when "0001" => hexread(L1, recaddr(15 downto 0)); when "0010" => hexread(L1, recaddr(23 downto 0)); when "0011" => hexread(L1, recaddr); recaddr(31 downto 24) := (others => '0'); when others => next; end case; hexread(L1, recdata); ai := conv_integer(recaddr)/4; for i in 0 to 3 loop bank3 (ai+i) := '0' & recdata((i*32) to (i*32+7)); bank2 (ai+i) := '0' & recdata((i*32+8) to (i*32+8+7)); bank1 (ai+i) := '0' & recdata((i*32+16) to (i*32+16+7)); bank0 (ai+i) := '0' & recdata((i*32+24) to (i*32+24+7)); end loop; end if; end if; end if; end loop; FIRST := false; end if; WAIT ON Clk; IF Clk'EVENT AND Clk = '1' THEN IF CEN_n = '0' AND Zz = '0' THEN -- Write Address Register Addr_write := Addr_read; -- Read Address Register Addr_read := Addr_in ((addr_bits - 1) DOWNTO 2) & bAddr1 & bAddr0; -- Address Register IF AdvLd_n = '0' and ce = '1' THEN Addr_in := Addr; first_Addr := Addr(1 DOWNTO 0); bcnt := Addr(1 DOWNTO 0); END IF; -- Burst Logic IF Mode = '0' AND AdvLd_n = '1' THEN bcnt := bcnt + 1; ELSIF Mode = '1' AND AdvLd_n = '1' THEN IF (CONV_INTEGER1 (first_Addr) REM 2 = 0) THEN bcnt := bcnt + 1; ELSIF (CONV_INTEGER1 (first_Addr) REM 2 = 1) THEN bcnt := bcnt - 1; END IF; END IF; bAddr1 := bcnt (1); bAddr0 := bcnt (0); -- Read Logic ce_in (0) := ce_in (1); IF AdvLd_n = '0' THEN ce_in (1) := ce; END IF; rw_in (0) := rw_in (1); rw_in (1) := rw_in (2); IF AdvLd_n = '0' THEN rw_in (2) := NOT(ce AND NOT(Rw_n)); END IF; -- Write Registry and Data Coherency Control Logic bwa_in (0) := bwa_in (1); bwb_in (0) := bwb_in (1); bwc_in (0) := bwc_in (1); bwd_in (0) := bwd_in (1); bwa_in (1) := bwa_in (2); bwb_in (1) := bwb_in (2); bwc_in (1) := bwc_in (2); bwd_in (1) := bwd_in (2); bwa_in (2) := Bwa_n; bwb_in (2) := Bwb_n; bwc_in (2) := Bwc_n; bwd_in (2) := Bwd_n; -- Write Data to Memory IF rw_in (0) = '0' AND bwa_in (0) = '0' THEN bank0 (CONV_INTEGER1 (Addr_write)) := '0' & Dq ( ((data_bits-4) / 4) - 1 DOWNTO 0); END IF; IF rw_in (0) = '0' AND bwb_in (0) = '0' THEN bank1 (CONV_INTEGER1 (Addr_write)) := '0' & Dq (((data_bits-4) / 2 - 1) DOWNTO ((data_bits-4) / 4)); END IF; IF rw_in (0) = '0' AND bwc_in (0) = '0' THEN bank2 (CONV_INTEGER1 (Addr_write)) := '0' & Dq ((3 * ((data_bits-4) / 4)) - 1 DOWNTO ((data_bits-4) / 2)); END IF; IF rw_in (0) = '0' AND bwd_in (0) = '0' THEN bank3 (CONV_INTEGER1 (Addr_write)) := '0' & Dq ((data_bits-4) - 1 DOWNTO (3 * ((data_bits-4) / 4))); END IF; END IF; Addr_read_sig <= Addr_read; -- Read Data from Memory Array IF ce_in (0) = '1' AND rw_in (1) = '1' THEN dout (((data_bits-4) / 4) - 1 DOWNTO 0) <= bank0 (CONV_INTEGER1 (Addr_read))(7 downto 0); dout (((data_bits-4) / 2 - 1) DOWNTO ((data_bits-4) / 4)) <= bank1 (CONV_INTEGER1 (Addr_read))(7 downto 0); dout ((3 * ((data_bits-4) / 4)) - 1 DOWNTO ((data_bits-4) / 2)) <= bank2 (CONV_INTEGER1 (Addr_read))(7 downto 0); dout ((data_bits-4) - 1 DOWNTO (3 * ((data_bits-4) / 4))) <= bank3 (CONV_INTEGER1 (Addr_read))(7 downto 0);-- dout ((data_bits / 4) - 1 DOWNTO 0) <= bank0 (CONV_INTEGER1 (Addr_read));-- dout ((data_bits / 2 - 1) DOWNTO (data_bits / 4)) <= bank1 (CONV_INTEGER1 (Addr_read));-- dout ((3 * (data_bits / 4)) - 1 DOWNTO (data_bits / 2)) <= bank2 (CONV_INTEGER1 (Addr_read));-- dout (data_bits - 1 DOWNTO (3 * (data_bits / 4))) <= bank3 (CONV_INTEGER1 (Addr_read)); ELSE dout <= (OTHERS => 'Z'); END IF; END IF; END PROCESS;END behave;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -