2016-05-03 77 views
-2

我想要做的是添加元素0+11,然後1+10,然後2+9,並像所有其他人一樣,但是當我模擬時,它只需要第一個元素( 0,11)。我還認爲在一個時鐘事件中採取這些值是個好主意,但我不確定。VHDL for循環總是給我相同的值

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; 

一些仿真結果: Here is the simulation result Another one

+0

我不認爲這個問題很糟糕。它展現了我在不懂信號分配語義的年輕工程師中經常看到的編碼錯誤。馬修泰勒給出了一個很好的答案,解釋了覆蓋之前答案的循環中的任務。 – PlayDough

回答

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; 

因爲ABC是VHDL 信號(任何端口是一個信號) 。 VHDL信號在進程暫停之前不會更新。因此,因爲ABC是信號,所以它們在此行C<=A+B中的值將始終是上一次執行該過程時的值,在此行data<=C中的值將爲C。在這種情況下,前一次執行過程將是clk的前一個上升沿。所以,對此的解決方案是將ABC替換爲變量。變量就像任何其他語言的變量 - 它們的值會立即更新。所以,這是更接近:

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應當用於通信的進程之間。

A VHDL variable應該用作工作內存之內的一個過程。

但是......

二)規劃問題:就像我說的,我不知道您的設計意圖,但是這個代碼總是會只是添加元素0到11,沒有別的,因爲C是覆蓋每個循環。

+0

我也藉機縮進了您的代碼並刪除了不必要的括號。 –