⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档.txt

📁 altcam远程控制存取
💻 TXT
📖 第 1 页 / 共 5 页
字号:
                                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 + -