Vhdl 当两个地址的值相同时,我如何读取这个ram并返回一个q=1

Vhdl 当两个地址的值相同时,我如何读取这个ram并返回一个q=1,vhdl,ram,Vhdl,Ram,我创建了这个ram: library ieee; use ieee.std_logic_1164.all; USE IEEE.STD_LOGIC_UNSIGNED.ALL; entity true_dpram_sclk is port ( data_a : in std_logic_vector(7 downto 0); data_b : in std_logic_

我创建了这个ram:

    library ieee;
        use ieee.std_logic_1164.all;
        USE IEEE.STD_LOGIC_UNSIGNED.ALL;
        entity true_dpram_sclk is
        port 
        (   
        data_a  : in std_logic_vector(7 downto 0);
        data_b  : in std_logic_vector(7 downto 0);
        address_a   : in std_logic_vector(7 downto 0);
        address_b   : in std_logic_vector(7 downto 0);
        we_a    : in std_logic := '1';
        --  we_b    : in std_logic := '1';
        clk     : in std_logic;
        q_a     : out std_logic_vector(7 downto 0);
        q_b     : out std_logic_vector(7 downto 0);
        q           : out std_logic
        );

        end true_dpram_sclk;

        architecture rtl of true_dpram_sclk is

        -- Build a 2-D array type for the RAM
        subtype word_t is std_logic_vector(7 downto 0);
        type memory_t is array(17 downto 0) of word_t;

        -- Declare the RAM
        shared variable ram : memory_t;
        SIGNAL ADDR_A : INTEGER RANGE 0 TO 17;
        SIGNAL ADDR_B : INTEGER RANGE 0 TO 17;

        begin

        -- Port A
        process(clk)
        begin
        ADDR_A<=CONV_INTEGER(ADDRESS_A);
        if(rising_edge(clk)) then 
            if(we_a = '1') then
                ram(addr_a) := data_a;
            elsif (we_a = '0') then
                q_a <= ram(addr_a);
            else
                q_a <= "ZZZZZZZZ";
            end if;
        end if; 
        end process;

        -- Port B
        process(clk)
        begin
        ADDR_B<=CONV_INTEGER(ADDRESS_B);
        if(rising_edge(clk)) then
            if(we_a = '1') then
                ram(addr_b) := data_b;
            elsif (we_a = '0') then
                q_b <= ram(addr_b);
            else
                q_b <= "ZZZZZZZZ";
            end if;
        end if; 
        end process;

        --   --MATCHER
        --  process (clk)
        --  begin
        --       if ((we_a = '0') and (we_b = '0') and ram(addr_a) = 
        --ram(addr_b)) then
        --                  q <= '1';
        --          else
        --                  q <= '0';
--   end if;        
--  end process;
--
end rtl;    
ieee库;
使用ieee.std_logic_1164.all;
使用IEEE.STD_LOGIC_UNSIGNED.ALL;
实体true\u dpram\u sclk为
港口
(   
数据a:标准逻辑向量(7到0);
数据b:标准逻辑向量(7到0);
地址a:在标准逻辑向量中(7到0);
地址b:在标准逻辑向量中(7到0);
we_a:在标准逻辑中:='1';
--we_b:在标准逻辑中:='1';
clk:标准逻辑中;
q_a:输出标准逻辑向量(7到0);
q_b:输出标准逻辑向量(7到0);
q:输出标准逻辑
);
结束真实的朝鲜半岛;
true_dpram_sclk的体系结构rtl是
--为RAM构建二维阵列类型
子类型字是标准逻辑向量(7到0);
类型memory_t是单词的数组(从17到0);
--申报公羊
共享变量ram:内存\u t;
信号地址A:整数范围0至17;
信号地址B:整数范围0至17;
开始
--A港
过程(clk)
开始
地址A地址b,
we_a=>we_a,
--we_b=>we_b,
时钟=>clk,
q_a=>q_a,
q_b=>q_b,
q=>q
);
--uut:匹配器端口映射(
--A=>q_A,
--B=>q_B,
--时钟=>clk,
--Q=>Q
--        );      
--时钟进程定义
clk_流程:流程
开始
clk图书馆的选择
失礼。那是一个不标准的图书馆。不要用它。换成

USE IEEE.NUMERIC_STD.ALL;
并使用
无符号
有符号
数据类型进行算术运算

尤其不要同时使用这两个库,就像你在测试台上做的那样


大小不匹配 图书馆的分配
地址
失礼。那是一个不标准的图书馆。不要用它。换成

USE IEEE.NUMERIC_STD.ALL;
并使用
无符号
有符号
数据类型进行算术运算

尤其不要同时使用这两个库,就像你在测试台上做的那样


大小不匹配
作业
ADDR\u a提供了一个最小的例子。我已经编辑了我的帖子,你可以查看,谢谢。提供一个最小的例子。我已经编辑了我的帖子,你可以查看,谢谢。在最后一部分,我想比较一下ram(ADDR\u a)=ram(ADDR\u b)。谢谢你提供的所有信息,我将非常感激@乔治,请看我的编辑。我犯了一些错误,丢失了时钟进程的if语句。在最后一部分中,我想比较ram(addr_a)=ram(addr_b)。感谢您提供的所有信息,我将非常感谢@乔治,请看我的编辑。我犯了一些错误,丢失了时钟进程的if语句。
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.NUMERIC_STD.ALL;
address_a   : in std_logic_vector(7 downto 0);
[...]
SIGNAL ADDR_A : INTEGER RANGE 0 TO 17;
[...]
ADDR_A<=CONV_INTEGER(ADDRESS_A);
-- Port A
process(clk)
begin
    ADDR_A<=CONV_INTEGER(ADDRESS_A);
    if (rising_edge(clk)) then 
if(we_a = '1') then
    [...]
elsif (we_a = '0') then
    [... we_a = '0' is redundant here ...]
else
    [... unreachable, as '1' and '0' are already covered ...]
end if;
if(we_a = '1') then
    ram(addr_b) := data_b;
else
    q_b <= ram(addr_b);
end if;
q_b <= ram(addr_b);
if(we_a = '1') then
    ram(addr_b) := data_b;
end if;
if [...] ram(addr_a) = ram(addr_b) [...] then
process (clk)
begin
    if rising_edge(clk) then
        if q_a = q_b then
            q <= '1';
        else
            q <= '0';
        end if;        
    end if;
end process;
ram(addr_a) = ram(addr_b)
addr_a = addr_b
process (clk)
begin
    if rising_edge(clk) then
        if addr_a = addr_b then
            q <= '1';
        else
            q <= '0';
        end if;
    end if;
end process;