Dies ist meine erste Zeitbuchung, also werde ich versuchen, so spezifisch wie möglich zu sein.Verwenden von "For-Loop" für Adressierungsmethode in generischem VHDL-Code
In dem Teil des Codes, den ich posten werde, versuche ich in generischer Weise den Code in der "Case" -ausdruck, die ich auskommentiert habe zu implementieren. Dieser Code ist Teil einer größeren Implementierung und ich habe nur die Signale behalten, die derzeit in diesem Code verwendet werden.
So ist das, was ich meine Ausgaben „kin“ und „din“ sein generisch und nach dem, was kommt „BUS_A“, die richtigen Worte in dem Adreßbus als Eingabe wollen (2 - Byte lang) der Register "kin_2" und "din_2" sollte zu diesem Zeitpunkt mit dem Wert "bus_di" eingegeben werden.
Für mein Beispiel hier, ich werde die ursprünglichen Längen für „kin“ und „din“ verwenden, die jeweils 128 Bit sind. Also für 128-Bit-Länge, N = 16 (16 * 8-Bit = 128bit) und K = 8.
library IEEE;
use IEEE.NUMERIC_STD.ALL;
use IEEE.STD_LOGIC_1164.ALL;
entity stck_if is
generic (N: integer:=16; K: integer:=8);
port ( -------------- Clock and Reset
clk: in std_logic;
rst: in std_logic;
bus_a: in std_logic_vector (15 downto 0); -- Address
bus_di: in std_logic_vector (15 downto 0); --Data In
kin: out std_logic_vector (8*N-1 downto 0);
din: out std_logic_vector (8*N-1 downto 0));
end stck_if;
architecture stck_if_arch of stck_if is
signal kin_2: std_logic_vector (8*N-1 downto 0);
signal din_2: std_logic_vector (8*N-1 downto 0);
signal encdec_2: std_logic;
signal trig_wr: std_logic;
begin
proc1: process(clk,rst)
variable int_add: integer:=0;
variable add: std_logic_vector (15 downto 0);
variable bit_add: std_logic_vector (15 downto 0);
begin
if rst='1' then
encdec_2<='0';
kin_2<=(others =>'0');
din_2<=(others =>'0');
elsif (clk'event and clk='1') then
if (trig_wr = '1') then
if (bus_a = "0000000000001100") then
encdec_2 <= bus_di(0);
end if;
for i in 0 to K-1 loop
bit_add:="0000000100000000";
int_add:= 2*i;
add:=std_logic_vector(to_unsigned(int_add, 16));
bit_add:= std_logic_vector(unsigned(bit_add) + unsigned(add));
if (bus_a = bit_add) then
kin_2((8*(N-int_add)-1) downto 8*(N-int_add)) <= bus_di;
end if;
end loop;
for i in 0 to K-1 loop
bit_add:="0000000101000000";
int_add:= 2*i;
add:=std_logic_vector(to_unsigned(int_add, 16));
bit_add:= std_logic_vector(unsigned(bit_add) + unsigned(add));
if (bus_a = bit_add) then
din_2((8*(N-int_add)-1) downto 8*(N-int_add)) <= bus_di;
end if;
end loop;
--case bus_a is
-- when "0000000000001100"=> encdec_2 <= bus_di(0); --bus_a = 000C hex
-- when "0000000100000000"=> kin_2(127 downto 112) <= bus_di; --bus_a = 0100 hex
-- when "0000000100000010"=> kin_2(111 downto 96) <= bus_di; --bus_a = 0102 hex
-- when "0000000100000100"=> kin_2(95 downto 80) <= bus_di; --bus_a = 0104 hex
-- when "0000000100000110"=> kin_2(79 downto 64) <= bus_di; --bus_a = 0106 hex
-- when "0000000100001000"=> kin_2(63 downto 48) <= bus_di; --bus_a = 0108 hex
-- when "0000000100001010"=> kin_2(47 downto 32) <= bus_di; --bus_a = 010A hex
-- when "0000000100001100"=> kin_2(31 downto 16) <= bus_di; --bus_a = 010C hex
-- when "0000000100001110"=> kin_2(15 downto 0) <= bus_di; --bus_a = 010E hex
-- when "0000000101000000"=> din_2(127 downto 112) <= bus_di; --bus_a = 0140 hex
-- when "0000000101000010"=> din_2(111 downto 96) <= bus_di; --bus_a = 0142 hex
-- when "0000000101000100"=> din_2(95 downto 80) <= bus_di; --bus_a = 0144 hex
-- when "0000000101000110"=> din_2(79 downto 64) <= bus_di; --bus_a = 0146 hex
-- when "0000000101001000"=> din_2(63 downto 48) <= bus_di; --bus_a = 0148 hex
-- when "0000000101001010"=> din_2(47 downto 32) <= bus_di; --bus_a = 014A hex
-- when "0000000101001100"=> din_2(31 downto 16) <= bus_di; --bus_a = 014C hex
-- when "0000000101001110"=> din_2(15 downto 0) <= bus_di; --bus_a = 014E hex
-- when others => null;
--end case;
end if;
end if;
end process;
kin <= kin_2;
din <= din_2;
end stck_if_arch;
I ModelSim PE Student Edition 10.4a verwenden. Um den Betrieb der Implementierung zu simulieren, habe ich den folgenden Code in der Befehlszeile von ModelSim: kompiliert
restart -f
//clock period 20ns
force -freeze sim:/stck_if/clk 1 0, 0 {10 ns} -r 20
//Activate reset
force -freeze sim:/stck_if/rst 1 0
run
//activate wr
force -freeze sim:/stck_if/trig_wr 1 0
force -freeze sim:/stck_if/rst 0 0
run
force -freeze sim:/stck_if/bus_a 16'h0100 0
force -freeze sim:/stck_if/bus_di 16'h1111 0
run
run
force -freeze sim:/stck_if/bus_a 16'h0102 0
run
run
force -freeze sim:/stck_if/bus_a 16'h0104 0
run
run
force -freeze sim:/stck_if/bus_a 16'h0106 0
run
run
force -freeze sim:/stck_if/bus_a 16'h0108 0
run
run
etc.
Obwohl der Code ohne einen Fehler zu geben, während der Simulation ModelSim die folgenden Fehler gibt:
- Kann wegen eines schwerwiegenden Fehlers nicht fortgesetzt werden. HDL Aufrufsequenz: bei C Gestoppt: /Modeltech_pe_edu_10.4a/examples/stack.vhd 53 ForLoop Schleife
Von dem, was ich verstehe, ist das Problem bei der Verwendung von „For-Schleife“ und von dem, was ich davon ausgehen, es muss sein, dass VHDL den folgenden Ausdruck nicht übersetzen kann:
kin_2((8*(N-int_add)-1) downto 8*(N-int_add)) <= bus_di;
in eine tatsächliche Schaltung.
Bin ich richtig mit meiner Hypothese? Irgendwelche Ideen, wie man dieses Problem löst, oder irgendwelche Vorschläge, wo ich schauen/lesen sollte, um meine Antworten zu finden, wäre wirklich hilfreich!
Beachten Sie, dass der Bereich "n-1 downto n" ein Nullbereich ist: Er wird als Teilbereich innerhalb eines Vektors verwendet und beschreibt einen Vektor ohne Elemente. Aber das ist kein fataler Fehler. Irgendwelche Nachrichten über die Breite stimmen nicht darin überein? –
@BrianDrummond Sie hatten Recht mit dem Bereich! Ich habe wieder am Anfang der Fehlermeldungen überprüft und der erste Fehler, der auftaucht (in blauer Farbe ?!) sagt: ** Fatal: (vsim-3420) Array-Längen stimmen nicht überein. Links ist 0 (127 bis 128 (Null-Array)). Richtig ist 16 (15 abwärts zu 0). ** Ich reparierte es, indem ich ein "+2" am zweiten "int_add" hinzufüge. Jetzt ist der Befehl der folgende: ** kin_2 ((8 * (N-int_add) -1) bis 8 * (N- (int_add + 2))) <= bus_di; ** Ich muss wirklich müde gewesen sein. Jetzt funktioniert der Code wie ein Zauber. Irgendwelche Optimierungen oder Ratschläge wären willkommen! Vielen Dank! –