我想要做的是添加元素0+11
,然后1+10
,然后添加2+9
,并将其与所有其他元素一起添加,但是当我模拟时,需要只是第一个元素(0,11)。我还认为在一个时钟事件中获取值是个好主意,但我不确定。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
entity Sumador is
Port ( clk : in STD_LOGIC;
en : in STD_LOGIC;
--actCont : in STD_LOGIC;
data : out STD_LOGIC_VECTOR (6 downto 0);
A,B: inout STD_LOGIC_VECTOR (6 downto 0);
C: inout STD_LOGIC_VECTOR (6 downto 0)
);
end Sumador;
architecture Behavioral of Sumador is
signal addr: STD_LOGIC_VECTOR(3 downto 0);
--signal A,B,C: STD_LOGIC_VECTOR(6 downto 0);
type arrayRom is array (0 to 11) of std_logic_vector(6 downto 0);
constant memRom: arrayRom:=(
"1111111",--0
"1001111",--1
"0010010",--2
"0000110",--3
"1001100",--4
"0100000",--5
"0001111",--6
"0000000",--7
"0001100",--8
"0000001",--9
"0001000",--10
"0100001"
);
begin
process(clk)
begin
if(RISING_EDGE(clk))then
if(en='1')then
for i in 0 to 11 loop
A<=memRom(i); --here i get the value from the i position of the constant memory
B<=memRom(11-i);
C<=A+B;
end loop;
data<=C;
else
--A<="0000000";
--B<="0000000";
--C<=A+B;
--data<=C;
data<="0000000";
end if;
end if;
end process;
end Behavioral;`enter code here`
在试验台上
enter code here
-- Stimulus process
stim_proc: process
begin
en<='0';
wait for 100 ns;
en<='1';
wait for 100 ns;
en<='0';
wait for 100 ns;
en<='1';
wait for 100 ns;
en<='0';
wait for 100 ns;
en<='1';
wait;
end process;
一些模拟结果:
答案 0 :(得分:1)
你的设计意图并不完全清楚,但我想你在这里有两个问题。一个是VHDL问题;一个是一般编程问题。
i)VHDL问题:这段代码永远不会像我想的那样做:
for i in 0 to 11 loop
A<=memRom(i); --here i get the value from the i position of the constant memory
B<=memRom(11-i);
C<=A+B;
end loop;
data<=C;
因为A
,B
和C
是VHDL 信号(任何端口都是信号)。在进程暂停之前,VHDL信号不会更新。因此,因为A
,B
和C
是信号,所以此行C<=A+B
中的值将始终是上一次执行流程时的值,因为此行C
中data<=C
的值。在这种情况下,执行该过程的上一次将是clk
的上一个上升沿。因此,解决此问题的方法是将A
,B
和C
替换为变量。变量就像任何其他语言中的变量一样 - 它们的值会立即更新。所以,这更接近:
process(clk)
variable A,B,C : STD_LOGIC_VECTOR (6 downto 0);
begin
if RISING_EDGE(clk) then
if en='1' then
for i in 0 to 11 loop
A := memRom(i); --here i get the value from the i position of the constant memory
B := memRom(11-i);
C := A+B;
end loop;
data<=C;
应使用VHDL signal
在进程之间进行通信。
VHDL variable
应该用作进程中的工作内存。
...然而
ii)编程问题:正如我所说,我不知道你的设计意图,但是这段代码总是只添加元素0和11而不是其他内容,因为C
会在每个循环中被覆盖。