44 Beiträge in diesem Thema

Geschrieben (bearbeitet)

Aber wenn du noch hier wärst könntest du mir noch bei Task 5 helfen?

In meiner Angabe steht: Lesen von addr2 und Schreiben auf addr1 kann gleichzeitig ausgefuhrt werden, wenn
addr1 sich von addr2 unterscheidet, addr2 sich von der nachsthoheren Adresse von
addr1 unterscheidet und und addr1 sich von der nachsthoheren Adresse von addr2
unterscheidet.

weiß aber nichtwie ich die Adresse um 1 erhöhe

addr2 /= addr1+1 einfach schreiben geht nicht

desc_232_Task5.pdf

RAM_beh.vhdl

 

Und es kommt die Fehlermeldung:

Error report:

Analyzation of your submitted behavior file failed:
** Error: RAM_beh.vhdl(41): (vcom-1581) No feasible entries for infix operator '+'.
** Error: RAM_beh.vhdl(41): ** Error: (vcom-1590) Bad expression in right operand of infix expression '/='.
** Error: RAM_beh.vhdl(41): Type error resolving infix expression "/=" as type std.STANDARD.BOOLEAN.
** Error: RAM_beh.vhdl(44): (vcom-1581) No feasible entries for infix operator '+'.
** Error: RAM_beh.vhdl(44): ** Error: (vcom-1590) Bad expression in right operand of infix expression '/='.
** Error: RAM_beh.vhdl(44): Type error resolving infix expression "/=" as type std.STANDARD.BOOLEAN.
bearbeitet von Tionium

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Aber wenn du noch hier wärst könntest du mir noch bei Task 5 helfen?

In meiner Angabe steht: Lesen von addr2 und Schreiben auf addr1 kann gleichzeitig ausgefuhrt werden, wenn
addr1 sich von addr2 unterscheidet, addr2 sich von der nachsthoheren Adresse von
addr1 unterscheidet und und addr1 sich von der nachsthoheren Adresse von addr2
unterscheidet.

weiß aber nichtwie ich die Adresse um 1 erhöhe

addr2 /= addr1+1 einfach schreiben geht nicht

desc_232_Task5.pdf

RAM_beh.vhdl

 

Und es kommt die Fehlermeldung:

Error report:

Analyzation of your submitted behavior file failed:
** Error: RAM_beh.vhdl(41): (vcom-1581) No feasible entries for infix operator '+'.
** Error: RAM_beh.vhdl(41): ** Error: (vcom-1590) Bad expression in right operand of infix expression '/='.
** Error: RAM_beh.vhdl(41): Type error resolving infix expression "/=" as type std.STANDARD.BOOLEAN.
** Error: RAM_beh.vhdl(44): (vcom-1581) No feasible entries for infix operator '+'.
** Error: RAM_beh.vhdl(44): ** Error: (vcom-1590) Bad expression in right operand of infix expression '/='.
** Error: RAM_beh.vhdl(44): Type error resolving infix expression "/=" as type std.STANDARD.BOOLEAN.

Ich bin mir nicht sicher aber ich denke, dass addr2 /= std_logic_vector(unsigned(addr1) + "000000001") funktionieren könnte, ähnlich wie beim Task mit dem Counter.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Ich bin mir nicht sicher aber ich denke, dass addr2 /= std_logic_vector(unsigned(addr1) + "000000001") funktionieren könnte, ähnlich wie beim Task mit dem Counter.

Ja funktioniert so, hab aber noch woeinen Fehler

 

Error report:

Your submitted behavior file does not behave like specified in the task description:
The upper half of input is not written to the memory correctly when only en_write is enabled. Note that the length of input is twice the length of each memory cell.

 

Muss es aufteilen auf den Speicher

Die Lange der Eingangsdaten ist doppelt so gro wie die Lange der Speicherzellen.
Daher soll die untere Halfte der Eingangsdaten an die angegebene Adresse und die
oberen Halfte an die nachsthohere Adresse geschrieben werden. Wir nehmen dabei
an, dass die letztmogliche Speicheradresse nie fur einen Schreibbefehl verwendet wird.


Die Lange der Ausgangsdaten ist doppelt so gro wie die Lange der Speicherzellen.
Daher sollen die Daten von der angegebenen Adresse gelesen und in die untere Halfte
der Ausgangsdaten gesetzt werden. In die obere Halfte der Ausgangsdaten sollen die
Daten von der nachsthoheren Adresse gesetzt werden. Wir nehmen dabei an, dass
die letztmogliche Speicheradresse nie fur einen Lesebefehl verwendet wird.

bearbeitet von Tionium

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Ja funktioniert so, hab aber noch woeinen Fehler

 

Error report:

Your submitted behavior file does not behave like specified in the task description:
The upper half of input is not written to the memory correctly when only en_write is enabled. Note that the length of input is twice the length of each memory cell.

Bei deinem Beispiel sind die Inputdaten genau doppelt so lange wie die Speicherzellen. Du musst jeden Schreibvorgang auf 2 Speicherzellen aufteilen, deshalb auch die sonst unverständliche Logik zwischen den beiden Adressen addr1 und addr2.

also z.B. 

ram(to_integer(unsigned(addr1))) <= input(7 downto 0);

ram(to_integer(unsigned(addr1) + "000000001")) <= input(15 downto 8);

Wenn ich deine Angabe richtig verstehe, dann müsste die WORD_SIZE 8 Bit betragen, und jeder Schreib- und Lesevorgang muss ich auf zwei übereinander liegende Speicherzellen beziehen. Lies dir noch einmal den letzten Absatz der Angabe durch. Du musst dein RAM etwas anders aufbauen und die Zugriffe entsprechend anpassen.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Bei deinem Beispiel sind die Inputdaten genau doppelt so lange wie die Speicherzellen. Du musst jeden Schreibvorgang auf 2 Speicherzellen aufteilen, deshalb auch die sonst unverständliche Logik zwischen den beiden Adressen addr1 und addr2.

also z.B. 

ram(to_integer(unsigned(addr1))) <= input(7 downto 0);

ram(to_integer(unsigned(addr1) + "000000001")) <= input(15 downto 8);

Wenn ich deine Angabe richtig verstehe, dann müsste die WORD_SIZE 8 Bit betragen, und jeder Schreib- und Lesevorgang muss ich auf zwei übereinander liegende Speicherzellen beziehen. Lies dir noch einmal den letzten Absatz der Angabe durch. Du musst dein RAM etwas anders aufbauen und die Zugriffe entsprechend anpassen.

Jo habs so gemacht und den Output auch geändert auf

output2(7 downto 0) <= ram(to_integer(unsigned(addr2)));
                 output2(15 downto  8 ) <=ram(to_integer(unsigned(addr2)+"000000001"));

hab aber noch ein Längen fehler

Error report:

Simulation Error:
** Error: (vsim-3420) Array lengths do not match. Left is 16 (15 downto 0). Right is 8 (7 downto 0).
** Warning: RAM_beh.vhdl(23): (vcom-1272) Length of expected is 16; length of actual is 8.
** Warning: RAM_beh.vhdl(24): (vcom-1272) Length of expected is 16; length of actual is 8.
** Warning: RAM_beh.vhdl(42): (vcom-1272) Length of expected is 16; length of actual is 8.
** Warning: RAM_beh.vhdl(47): (vcom-1272) Length of expected is 16; length of actual is 8.
** Warning: RAM_beh.vhdl(52): (vcom-1272) Length of expected is 16; length of actual is 8.

RAM_beh.vhdl

 

kann ich ram(to_integer(unsigned(addr1)+"000000001"))<= input(15 downto 8 ); zu ram(to_integer(unsigned(addr1)+"000000001")(7 downto 0)) <= input(15 downto  8 ) umschreiben?

glaub das der fehler kommt weil er versucht das 16 bit auf das 16te Bit im Ram zu schreien hat aber nur 8 Bit!!!

 

bearbeitet von Tionium

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Jo habs so gemacht und den Output auch geändert auf

output2(7 downto 0) <= ram(to_integer(unsigned(addr2)));
                 output2(15 downto  8 ) <=ram(to_integer(unsigned(addr2)+"000000001"));

hab aber noch ein Längen fehler

Error report:

Simulation Error:
** Error: (vsim-3420) Array lengths do not match. Left is 16 (15 downto 0). Right is 8 (7 downto 0).
** Warning: RAM_beh.vhdl(23): (vcom-1272) Length of expected is 16; length of actual is 8.
** Warning: RAM_beh.vhdl(24): (vcom-1272) Length of expected is 16; length of actual is 8.
** Warning: RAM_beh.vhdl(42): (vcom-1272) Length of expected is 16; length of actual is 8.
** Warning: RAM_beh.vhdl(47): (vcom-1272) Length of expected is 16; length of actual is 8.
** Warning: RAM_beh.vhdl(52): (vcom-1272) Length of expected is 16; length of actual is 8.

RAM_beh.vhdl

 

kann ich ram(to_integer(unsigned(addr1)+"000000001"))<= input(15 downto 8 ); zu ram(to_integer(unsigned(addr1)+"000000001")(7 downto 0)) <= input(15 downto  8 ) umschreiben?

glaub das der fehler kommt weil er versucht das 16 bit auf das 16te Bit im Ram zu schreien hat aber nur 8 Bit!!!

 

Du musst aus dem RAM einen 16 Bit Ausdruck erzeugen in der Art .. output <= ram("bereich high_byte")  & ram("bereich low_byte");

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Sorry, dass ich noch einmal frage, aber kann den Fehler immer wieder nicht finden.

Danke, falls jmd helfen kann.

 

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
 
architecture behavior of cache is
 
  subtype cache_entry_t is std_logic_vector(12-1 downto 0);
type cache_t is array(0 to 24-1) of cache_entry_t;
  
    
    constant cache : cache_t := (
    "100001000001",
        "101001011000",
        "110100000011",
        "111111000111",
        "111110101111",
        "111111001101",
        "100001110000",
        "100011001000",
        "011101100001",
        "101101011000",
        "111111111010",
        "100010001001",
        "110011000101",
        "000011101011",
        "111101110001",
        "111111010011",
        "101011001011",
        "111101100101",
        "100001100111",
        "110101010110",
        "111010000110",
        "111100011001",
        "111101110000",
        "101101101110"
        );
 
begin
process (clk)
    variable tag   : std_logic_vector(5-1 downto 0);
        variable index : integer range 0 to 31;
        
        variable data_out  : std_logic_vector(7-1 downto 0);
        variable ch_cm_out : std_logic;
    begin
        data_out  := (others => 'Z');
        ch_cm_out := '0';
        
    if (falling_edge(clk)) then
 
            if en_read = '1' then
        
        index := to_integer(unsigned(addr(4 downto 0)));
            tag   := addr(8-1 downto 3);
                
                if index <= cache'high and cache(index)(12-1 downto 7) = tag then
                             
                    data_out  := cache(index)(7-1 downto 0);
                ch_cm_out := '1';
               
                end if;
            end if;
            
data  <= data_out;
ch_cm <= ch_cm_out;
           
         end if;
    end process;
end behavior;
 
 
Error report:

Your submitted behavior file does not behave like specified in the task description:
For en_read = '1' and addr = "1010000001" the outputs should be data = "1011000" and ch_cm = '1' at the next falling_edge but your cache returns data = "ZZZZZZZ" and ch_cm = '0'.
 
 

desc_52_Task6.pdf

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Sorry, dass ich noch einmal frage, aber kann den Fehler immer wieder nicht finden.

Danke, falls jmd helfen kann.

 

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
 
architecture behavior of cache is
 
  subtype cache_entry_t is std_logic_vector(12-1 downto 0);
type cache_t is array(0 to 24-1) of cache_entry_t;
  
    
    constant cache : cache_t := (
    "100001000001",
        "101001011000",
        "110100000011",
        "111111000111",
        "111110101111",
        "111111001101",
        "100001110000",
        "100011001000",
        "011101100001",
        "101101011000",
        "111111111010",
        "100010001001",
        "110011000101",
        "000011101011",
        "111101110001",
        "111111010011",
        "101011001011",
        "111101100101",
        "100001100111",
        "110101010110",
        "111010000110",
        "111100011001",
        "111101110000",
        "101101101110"
        );
 
begin
process (clk)
    variable tag   : std_logic_vector(5-1 downto 0);
        variable index : integer range 0 to 31;
        
        variable data_out  : std_logic_vector(7-1 downto 0);
        variable ch_cm_out : std_logic;
    begin
        data_out  := (others => 'Z');
        ch_cm_out := '0';
        
    if (falling_edge(clk)) then
 
            if en_read = '1' then
        
        index := to_integer(unsigned(addr(4 downto 0)));
            tag   := addr(8-1 downto 3);
                
                if index <= cache'high and cache(index)(12-1 downto 7) = tag then
                             
                    data_out  := cache(index)(7-1 downto 0);
                ch_cm_out := '1';
               
                end if;
            end if;
            
data  <= data_out;
ch_cm <= ch_cm_out;
           
         end if;
    end process;
end behavior;
 
 
Error report:

Your submitted behavior file does not behave like specified in the task description:
For en_read = '1' and addr = "1010000001" the outputs should be data = "1011000" and ch_cm = '1' at the next falling_edge but your cache returns data = "ZZZZZZZ" and ch_cm = '0'.
 
 

desc_52_Task6.pdf

Deine Adresse ist ja 10 Bit lang also muss es heißen

index := to_integer(unsigned(addr(4 downto 0)));

tag  := addr(10-1 downto 5);

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

 

Deine Adresse ist ja 10 Bit lang also muss es heißen

index := to_integer(unsigned(addr(4 downto 0)));

tag  := addr(10-1 downto 5);

 

Achso JA!!

VIelen Dank!!!!!

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Ich verstehe mein Fehler nicht. Könnte jemand mir erklären?

 

RAM_beh.vhdl

desc_79_Task5.pdf

 

InkedScreenshot_70_LI.jpg

bearbeitet von Nikola M

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Wie lautet der Fehler?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

InkedScreenshot_70_LI.jpg

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

InkedScreenshot_70_LI.jpg

Kannst du dein Ram_beh.vhdl hochladen, dann werfe ich einen Blick hinein.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Ammmm hab gelöst. Hab es übergesehen.... Es solte 2^11 -1 sein..

Hab darüber. ^ 

bearbeitet von Nikola M

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Deine Lösung enthält mehrere Fehler:

1) Index muss mindestens von 0 bis 31 gehen.

2) Dein Cache ist falsch. Er enthält nur die Daten, aber nicht den Tag. Ein Cache-Eintrag sollte 11 Bit lang sein, bei dir sind es nur 8 Bit.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Konnte jemand mir helfen ?
Ich bekomme diese Fehler: 

cache_beh.vhdl

desc_80_Task6.pdf

problem.JPG

Falls du es noch nicht gelöst hast ...

tag   := addr(10-1 downto 6);

Im Tag links laufen die Indizes von 5..0, also 6 Bits, im Ausdruck rechts von 9..6, also nur 4 Bits. Das passt nicht zusammen. Richtig wäre deshalb

tag   := addr(10-1 downto 4);

Außerdem sollte der Index nur 4 Bits umfassen:

 variable index : integer range 0 to 15;

index := to_integer(unsigned(addr(3 downto 0)));

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

könnte jemand kurz helfen

RAM_beh.vhdl

desc_158_Task5.pdf

_________________________


Your submitted behavior file does not behave like specified in the task description:
The upper half of input is not written to the memory correctly when en_write is only enabled.

____________________

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.Numeric_Std.all;

architecture Behavioral of RAM is
    constant WORD_SIZE : natural := 12;
    constant RAM_SIZE  : natural := 2**6;
    
    constant HIGH_IMP  : std_logic_vector(WORD_SIZE-1 downto 0) := (others => 'Z');
    
    subtype word_t is std_logic_vector(WORD_SIZE-1 downto 0);
    type memory_t  is array(0 to RAM_SIZE-1) of word_t;
    
    signal ram     : memory_t := (others => (others => '0'));   
begin
    process (clk)
       variable choices : std_logic_vector(1 downto 0);
    begin
       if rising_edge(clk) then
          
             output <= HIGH_IMP;
             
             choices := en_read & en_write;
       
          case choices is
                when "10" =>
                      output <= ram(to_integer(unsigned(addr2)));
                
                when "01" =>
                      ram(to_integer(unsigned(addr1))) <= input(23-12 downto 0);
                      ram(to_integer(unsigned(addr2))) <= input(23 downto 12);
                 
                when "11" =>
                      output <= ram(to_integer(unsigned(addr2)));
                      ram(to_integer(unsigned(addr1))) <= input(23-12 downto 0);
                      ram(to_integer(unsigned(addr2))) <= input(23 downto 12);
                         
             when others => null;
          end case;
       end if;
    end process;
end Behavioral;

bearbeitet von Jumi

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Geht einfach!


Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.


Jetzt anmelden