📄 vram.vhd
字号:
-- Behavioural implementation of VDP Video Ram
-- Provides warning errors of RAM timing parameters
-- are not met
-- Thomas Clarke, 2001
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_arith.ALL;
USE work.vdp_pack.ALL;
ENTITY vram IS
PORT(
vdin : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
vdout : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
vaddr : IN STD_LOGIC_VECTOR;
vwrite : IN STD_LOGIC
);
END vram;
ARCHITECTURE behav OF vram IS
SIGNAL ram_write_detect : STD_LOGIC := '0';
SIGNAL vaddr_delta_1 : STD_LOGIC_VECTOR(vaddr'RANGE);
SIGNAL vwrite_delta_1: std_logic;
SIGNAL dout_valid : BOOLEAN;
BEGIN
vaddr_delta_1 <= vaddr;
vwrite_delta_1 <= vwrite;
dout_valid <= vaddr'STABLE(tracc);
ASSERT vaddr'STABLE(taws) OR (vwrite = '0') REPORT
"vram address setup error"
SEVERITY warning;
p_trwp_check : PROCESS
BEGIN
WAIT UNTIL vwrite'EVENT AND vwrite = '0' AND vwrite'LAST_VALUE = '1'
AND NOT vwrite_delta_1'STABLE(twp);
REPORT "write pulse < twp" SEVERITY warning;
END PROCESS p_trwp_check;
p_write : PROCESS
BEGIN
WAIT UNTIL vwrite'EVENT AND vwrite = '0' AND vwrite'LAST_VALUE = '1'
AND vwrite_delta_1'STABLE(twp);
-- check that data setup time has been met
IF vdin'STABLE(twds) THEN
-- write data
ram_data(conv_integer(UNSIGNED(vaddr_delta_1))) := vdin;
ELSE
-- write undefined (setup violation)
ram_data(conv_integer(UNSIGNED(vaddr_delta_1))) := (OTHERS => 'X');
END IF;
ram_write_detect <= NOT ram_write_detect; -- trigger read process
END PROCESS p_write;
p_read : PROCESS
BEGIN
-- output data may change if either dout_valid, vaddr,
-- or ram_write_detect changes
WAIT UNTIL vaddr'EVENT OR dout_valid'EVENT OR ram_write_detect'EVENT;
IF dout_valid THEN --address stable for more than tracc, so data ok
vdout <= ram_data(conv_integer(UNSIGNED(vaddr)));
ELSE -- addres stable for les than tracc, so data undefined
vdout <= (OTHERS => 'X');
END IF;
END PROCESS p_read;
END behav;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -