Vhdl 当两个地址的值相同时,我如何读取这个ram并返回一个q=1
我创建了这个ram: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_
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;