2016-05-03 16 views
-2

Was ich tun möchte, ist das Element 0+11, dann 1+10, dann 2+9 und so mit allen anderen, aber wenn ich simuliere, es dauert nur die ersten Elemente (0,11). Ich dachte auch, es wäre eine gute Idee, die Werte in einem Clock-Event zu nehmen, aber ich bin mir nicht sicher.VHDL for Schleife geben Sie mir immer den gleichen Wert

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` 

auf dem Prüfstand

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; 

Einige Simulationsergebnisse: Here is the simulation result Another one

+0

Ich denke nicht, dass diese Frage so schlecht ist. Es weist einen Codierungsfehler auf, den ich oft bei jungen Ingenieuren sehe, die die Signalzuweisungssemantik nicht verstehen. Matthew Taylor gab eine großartige Antwort und erklärte die Aufgabe in einer Schleife, die eine vorherige Antwort überschrieb. – PlayDough

Antwort

1

Ihre Konstruktionsabsicht ist nicht ganz klar, aber ich würde sagen, Sie hier zwei Probleme haben. Eines ist ein VHDL-Problem; Eines ist ein allgemeines Programmierproblem.

i) Das VHDL Problem: Dieser Code wird wie nie tun (glaube ich) Sie beabsichtigen:

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; 

weil A, B und C sind VHDL Signale (jede Port ist ein Signal) . VHDL-Signale werden erst aktualisiert, wenn der Prozess ausgesetzt wird. Also, weil A, B und C sind Signale, ihre Werte in dieser Zeile C<=A+B werden immer die Werte aus der vorherigen Zeit der Prozess ausgeführt wurde, wie auch der Wert C in dieser Zeile data<=C sein wird. In diesem Fall war die vorherige Zeit, zu der der Prozess ausgeführt wurde, die vorherige ansteigende Flanke von clk. Eine Lösung wäre also, A, B und C durch Variablen zu ersetzen. Variablen sind wie Variablen in jeder anderen Sprache - ihre Werte werden sofort aktualisiert. Also, das ist näher:

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; 

A VHDL signal sollte die Kommunikation zwischen Prozesse verwendet werden.

A VHDL variable sollten als Arbeitsspeicher innerhalb Verfahren verwendet werden.

jedoch ...

ii) Das Problem der Programmierung: wie ich sage, ich weiß nicht, Ihre Konstruktionsabsicht, aber dieser Code ist immer gerade dabei Elemente hinzufügen 0 und 11 und sonst nichts, weil C ist in jeder Schleife überschrieben.

+0

Ich habe auch die Gelegenheit genutzt, um Ihren Code einzurücken und unnötige Klammern zu entfernen. –