📄 新建 文本文档.txt
字号:
end if;
end loop wword_fm1;
end loop waddr_fm1;
end if;
mcount_int <= ieee.std_logic_arith.conv_std_logic_vector(count, widthad);
mbits_int <= mbits_tmp;
end if; -- end of FAST MULTIPLE
--------------------------------
-- MULTIPLE: READ AFTER WRITE --
--------------------------------
-- THIS IMPLEMENTATION IS INACCURATE
if match_mode = "MULTIPLE" then
mfound_int <= '0';
maddress_int <= (others => '1');
mbits_tmp := (others => '0');
if (writex = true) and (iwrxused = '1') then
mcount_int <= (others => '0');
else
if first_read_in_write = false then
-- Read even addresses but they appear on the odd locations
-- of mbits.
count := 0;
waddr_mm0: for i in 0 to numwords-1 loop
if ( (i mod 2) = 0 ) then
if (mbits_int(i) = '1') then -- counting previous even address matches
count := count + 1;
end if;
wword_mm0: for j in 0 to width-1 loop
if (((x_array(i)(j) = '0') and (cam_array(i)(j) = ipattern(j))) or
((x_array(i)(j) = '1') and (cam_array(i)(j) = '0'))) then
if j = width-1 then
mbits_tmp(i+1) := '1';
count := count + 1;
end if;
else
exit wword_mm0;
end if;
end loop wword_mm0;
end if;
end loop waddr_mm0;
else
-- Read odd addresses.
count := 0;
waddr_mm1: for i in numwords-1 downto 0 loop
if (i mod 2) = 1 then
mbits_tmp(i-1) := mbits_tmp(i);
else
wword_mm1: for j in 0 to width-1 loop
if (((x_array(i)(j) = '0') and (cam_array(i)(j) = ipattern(j))) or
((x_array(i)(j) = '1') and (cam_array(i)(j) = '0'))) then
if j = width-1 then
mbits_tmp(i) := '1';
count := count + 1;
end if;
else
exit wword_mm1;
end if;
end loop wword_mm1;
end if;
end loop waddr_mm1;
end if;
mcount_int <= ieee.std_logic_arith.conv_std_logic_vector(count, widthad);
mbits_int <= mbits_tmp;
end if;
end if; -- end of MULTIPLE
------------------------------
-- SINGLE: READ AFTER WRITE --
------------------------------
if match_mode = "SINGLE" then
mbits_tmp := (others => '0');
index := 0;
count := 0;
if (writex = true) and (iwrxused = '1') then
waddr_sm0: for i in 0 to numwords-1 loop
wword_sm0: for j in 0 to width-1 loop
if (((x_array(i)(j) = '0') and (cam_array(i)(j) = (ipattern(j) xor iwrx(j)))) or
((x_array(i)(j) = '1') and (cam_array(i)(j) = '0'))) then
if j = width-1 then
mbits_tmp(i) := '1';
index := i;
count := 1;
exit waddr_sm0;
end if;
else
exit wword_sm0;
end if;
end loop wword_sm0;
end loop waddr_sm0;
else
waddr_sm1: for i in 0 to numwords-1 loop
wword_sm1: for j in 0 to width-1 loop
if (((x_array(i)(j) = '0') and (cam_array(i)(j) = ipattern(j))) or
((x_array(i)(j) = '1') and (cam_array(i)(j) = '0'))) then
if j = width-1 then
mbits_tmp(i) := '1';
index := i;
count := 1;
exit waddr_sm1;
end if;
else
exit wword_sm1;
end if;
end loop wword_sm1;
end loop waddr_sm1;
end if;
mcount_int <= ieee.std_logic_arith.conv_std_logic_vector(count, widthad);
mbits_int <= mbits_tmp;
if count = 0 then
mfound_int <= '0';
maddress_int <= (others => '0');
else
mfound_int <= '1';
maddress_int <= ieee.std_logic_arith.conv_std_logic_vector(index, widthad);
end if;
end if; -- end of SINGLE
end if;
else -- if inclock negedge
-- We write to the CAM on the low cycle of inclock
-- when wren_rgd='1'.
if (wren_rgd='1') and (inclock='0') then
if pattern_reg = "UNREGISTERED" then
ipattern := pattern;
else
ipattern := pattern_rgd;
end if;
addr := ieee.std_logic_unsigned.conv_integer(wraddress_rgd);
cam_array_tmp := cam_array;
x_array_tmp := x_array;
---------------------
-- CAM WRITE MODES --
---------------------
if wrdelete_rgd = '0' then
if (wrxused_int = '1') and (wrx_reg /= "UNUSED") and (wrx_aclr /= "UNUSED") then
-------------------
-- 3 CYCLE WRITE --
-------------------
-----------------
-- WRITE_ZEROS --
-----------------
if write0 = true then
for i in 0 to width-1 loop
if ipattern(i) = '0' then
-- "0" => "0"
if (cam_array(addr)(i)='0' and x_array(addr)(i)='0') then -- "0"
cam_array_tmp(addr)(i) := '0';
x_array_tmp(addr)(i) := '0';
-- "1" => "X"
elsif (cam_array(addr)(i)='1' and x_array(addr)(i)='0') then -- "1"
cam_array_tmp(addr)(i) := '0';
x_array_tmp(addr)(i) := '1';
-- "X" => "X"
elsif (cam_array(addr)(i)='0' and x_array(addr)(i)='1') then -- "X"
cam_array_tmp(addr)(i) := '0';
x_array_tmp(addr)(i) := '1';
-- "U" => "0"
elsif (cam_array(addr)(i)='1' and x_array(addr)(i)='1') then -- "U"
cam_array_tmp(addr)(i) := '0';
x_array_tmp(addr)(i) := '0';
end if;
elsif ipattern(i) = '1' then
-- "0" => "X"
if (cam_array(addr)(i)='0' and x_array(addr)(i)='0') then -- "0"
cam_array_tmp(addr)(i) := '0';
x_array_tmp(addr)(i) := '1';
-- "1" => "1"
elsif (cam_array(addr)(i)='1' and x_array(addr)(i)='0') then -- "1"
cam_array_tmp(addr)(i) := '1';
x_array_tmp(addr)(i) := '0';
-- "X" => "X"
elsif (cam_array(addr)(i)='0' and x_array(addr)(i)='1') then -- "X"
cam_array_tmp(addr)(i) := '0';
x_array_tmp(addr)(i) := '1';
-- "U" => "1"
elsif (cam_array(addr)(i)='1' and x_array(addr)(i)='1') then -- "U"
cam_array_tmp(addr)(i) := '1';
x_array_tmp(addr)(i) := '0';
end if;
end if;
end loop;
write0_done <= true;
write1_done <= false;
writex_done <= false;
end if;
----------------
-- WRITE_ONES --
----------------
if write1 = true then
for i in 0 to width-1 loop
if ipattern(i) = '0' then
-- "0" => "0"
if (cam_array(addr)(i)='0' and x_array(addr)(i)='0') then -- "0"
cam_array_tmp(addr)(i) := '0';
x_array_tmp(addr)(i) := '0';
-- "1" => "U"
elsif (cam_array(addr)(i)='1' and x_array(addr)(i)='0') then -- "1"
cam_array_tmp(addr)(i) := '1';
x_array_tmp(addr)(i) := '1';
-- "X" => "0"
elsif (cam_array(addr)(i)='0' and x_array(addr)(i)='1') then -- "X"
cam_array_tmp(addr)(i) := '0';
x_array_tmp(addr)(i) := '0';
-- "U" => "U"
elsif (cam_array(addr)(i)='1' and x_array(addr)(i)='1') then -- "U"
cam_array_tmp(addr)(i) := '1';
x_array_tmp(addr)(i) := '1';
end if;
elsif ipattern(i) = '1' then
-- "0" => "U"
if (cam_array(addr)(i)='0' and x_array(addr)(i)='0') then -- "0"
cam_array_tmp(addr)(i) := '1';
x_array_tmp(addr)(i) := '1';
-- "1" => "1"
elsif (cam_array(addr)(i)='1' and x_array(addr)(i)='0') then -- "1"
cam_array_tmp(addr)(i) := '1';
x_array_tmp(addr)(i) := '0';
-- "X" => "1"
elsif (cam_array(addr)(i)='0' and x_array(addr)(i)='1') then -- "X"
cam_array_tmp(addr)(i) := '1';
x_array_tmp(addr)(i) := '0';
-- "U" => "U"
elsif (cam_array(addr)(i)='1' and x_array(addr)(i)='1') then -- "U"
cam_array_tmp(addr)(i) := '1';
x_array_tmp(addr)(i) := '1';
end if;
end if;
end loop;
write0_done <= false;
write1_done <= true;
writex_done <= false;
end if;
-------------
-- WRITE_X --
-------------
if writex = true then
for i in 0 to width-1 loop
if (ipattern(i) xor wrx_int(i)) = '0' then
-- "0" => "0"
if (cam_array(addr)(i)='0' and x_array(addr)(i)='0') then -- "0"
cam_array_tmp(addr)(i) := '0';
x_array_tmp(addr)(i) := '0';
-- "1" => "X"
elsif (cam_array(addr)(i)='1' and x_array(addr)(i)='0') then -- "1"
cam_array_tmp(addr)(i) := '0';
x_array_tmp(addr)(i) := '1';
-- "X" => "X"
elsif (cam_array(addr)(i)='0' and x_array(addr)(i)='1') then -- "X"
cam_array_tmp(addr)(i) := '0';
x_array_tmp(addr)(i) := '1';
-- "U" => "0"
elsif (cam_array(addr)(i)='1' and x_array(addr)(i)='1') then -- "U"
cam_array_tmp(addr)(i) := '0';
x_array_tmp(addr)(i) := '0';
end if;
elsif (ipattern(i) xor wrx_int(i)) = '1' then
-- "0" => "X"
if (cam_array(addr)(i)='0' and x_array(addr)(i)='0') then -- "0"
cam_array_tmp(addr)(i) := '0';
x_array_tmp(addr)(i) := '1';
-- "1" => "1"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -