44 Beiträge in diesem Thema

Geschrieben

Moin,

Hat schon jemand einen Ansatz zu einem der neuen Tasks?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Eine mögliche Lösung für Task 5.

 

RAM_beh.vhdl

RAM.vhdl

desc_32_Task5.pdf

bearbeitet von oreset
1 Person gefällt das

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Servus!
 

Warum eine "mögliche" Lösung? Hat es geklappt als du es abgeschickt hast?

 

lg

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Servus!
 

Warum eine "mögliche" Lösung? Hat es geklappt als du es abgeschickt hast?

 

lg

Es gibt sicher viele Möglichkeiten, Task 5 zu lösen. Die von mir vorgestellte Variante war jedenfalls erfolgreich.

2 Personen gefällt das

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

+1 größeres Array als nötig? Dachte VELS überprüft das

Wo genau siehst du einen Fehler in der Arraygröße?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Wo genau siehst du einen Fehler in der Arraygröße?

Sorry habe übersehen dass die Nummer der Cache Einträge 6 beträgt.

bearbeitet von halbawgn

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Error report:

Simulation Error:
** Error: (vsim-3421) Value 8 is out of range 0 to 7.

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(8-1 downto 0);
	TYPE cache_struct IS array(0 to 10-1) of cache_entry_t;

	CONSTANT cache : cache_struct := (
    	"11011110",
        "10111110",
        "10111101",
        "10001100",
        "10001001",
        "10001001",
        "11001101",
        "10001010",
        "10011100",
        "10001011"
        );
	
BEGIN PROCESS (clk)
    	
		VARIABLE tag   : std_logic_vector(4-1 downto 0); 

		-- falsch    
		--VARIABLE index : integer range 0 to 7;
		-- falsch 

		VARIABLE index : integer range 0 to 256;

		VARIABLE data_tmp  : std_logic_vector(4-1 downto 0);
		VARIABLE ch_cm_tmp : std_logic;

		BEGIN
		
			data_tmp  := (OTHERS => 'Z');
			ch_cm_tmp := '0';
			
			IF ( falling_edge(clk) ) THEN

				IF (en_read = '1') THEN
  
					index := to_integer(unsigned(addr(3 downto 0)));
          			        tag   := addr(8-1 downto 4);
                
					IF (index <= cache'high) AND (cache(index)(8-1 downto 4) = tag) THEN
                          
						data_tmp  := cache(index)(4-1 downto 0);
						ch_cm_tmp := '1';
						
					END IF;
				END IF;

			data  <= data_tmp;
			ch_cm <= ch_cm_tmp;

			END IF;
	END PROCESS;
END behavior;

Ich verstehe nicht was der Fehler ist

cache_beh.vhdl

desc_254_Task6.pdf

bearbeitet von halbawgn

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Error report:

Simulation Error:
** Error: (vsim-3421) Value 8 is out of range 0 to 7.

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(8-1 downto 0);
	TYPE cache_struct IS array(0 to 10-1) of cache_entry_t;

	CONSTANT cache : cache_struct := (
    	"11011110",
        "10111110",
        "10111101",
        "10001100",
        "10001001",
        "10001001",
        "11001101",
        "10001010",
        "10011100",
        "10001011"
        );
	
BEGIN PROCESS (clk)
    	
		VARIABLE tag   : std_logic_vector(4-1 downto 0);      
		VARIABLE index : integer range 0 to 7;
		VARIABLE data_tmp  : std_logic_vector(4-1 downto 0);
		VARIABLE ch_cm_tmp : std_logic;

		BEGIN
		
			data_tmp  := (OTHERS => 'Z');
			ch_cm_tmp := '0';
			
			IF ( falling_edge(clk) ) THEN

				IF (en_read = '1') THEN
  
					index := to_integer(unsigned(addr(3 downto 0)));
          			        tag   := addr(8-1 downto 4);
                
					IF (index <= cache'high) AND (cache(index)(8-1 downto 4) = tag) THEN
                          
						data_tmp  := cache(index)(4-1 downto 0);
						ch_cm_tmp := '1';
						
					END IF;
				END IF;

			data  <= data_tmp;
			ch_cm <= ch_cm_tmp;

			END IF;
	END PROCESS;
END behavior;

Ich verstehe nicht was der Fehler ist

cache_beh.vhdl

desc_254_Task6.pdf

Der Indexbereich ist falsch. Du musst den Bereich für die Variable index für deine Angabe auf 0 bis 9 setzen.

1 Person gefällt das

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Danke. Mein Tippfehler.

Ich glaub es liegt am VELS

Error report:

Simulation Error:
** Error: (vsim-3421) Value 10 is out of range 0 to 9.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

VARIABLE index : integer range 0 to 256;

Funktioniert so. Datenbreite addr = 8 =>  2^8  = 256

Danke für die Hilfe

bearbeitet von halbawgn

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Danke. Mein Tippfehler.

Ich glaub es liegt am VELS

Error report:

Simulation Error:
** Error: (vsim-3421) Value 10 is out of range 0 to 9.

Vielleicht probieren Sie mit VELS den gesamten möglichen Indexbereich von 4 Bit aus. Du kannst probeweise index auf 0 bis 15 setzen, der Zugriffscheck erfolgt ja sowieso bei der if-Abfrage

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Wäre sehr dankbar für eure Hilfe.

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'.
** Warning: cache_beh.vhdl(56): (vcom-1083) Implicit array operator "=" always returns FALSE (left length 7 is not equal to right length 5).

... komme nicht weiter.

Danke!

cache_beh.vhdl

desc_52_Task6.pdf

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Wäre sehr dankbar für eure Hilfe.

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'.
** Warning: cache_beh.vhdl(56): (vcom-1083) Implicit array operator "=" always returns FALSE (left length 7 is not equal to right length 5).

... komme nicht weiter.

Danke!

cache_beh.vhdl

desc_52_Task6.pdf

Du muss die Zeile 56 so ändern, dass du den TAG-Anteil des Caches mit dem TAG vergleichst. Nachdem der Tag bei dir 5 Bits lang ist muss der Bereich Bit 11, Bit 10, Bit 9, Bit 8 und Bit 7 umfassen. Richtig wäre die Zeile also so:

 if index <= cache'high and cache(index)(12-1 downto 7) = tag then

Außerdem sollte der Indexbereich größer sein. Der Index setzt sich aus 5 Bitstellen zusammen, sollte daher von 0 bis 31 gehen. Bei 0 bis 25 wird bei der Überprüfung in VELS sicher ein Indexfehler auftreten.

desc_32_Task6.pdf

bearbeitet von oreset

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Hab das gleiche Problem. 

Error report:

Your submitted behavior file does not behave like specified in the task description:
For en_read = '1' and addr = "10110001" the outputs should be data = "01011110" and ch_cm = '1' at the next rising_edge but your cache returns data = "ZZZZZZZZ" and ch_cm = '0'.
** Warning: cache_beh.vhdl(37): (vcom-1167) Index value 9 (of type ieee.std_logic_1164.STD_LOGIC_VECTOR) is out of range 7 downto 0.
** Warning: cache_beh.vhdl(37): (vopt-1167) Index value 9 (of type ieee.std_logic_1164.STD_LOGIC_VECTOR) is out of range 7 downto 0.
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(13-1 downto 0);
type cache_t is array(0 to 7-1) of cache_entry_t;
  
    
    constant cache : cache_t := (
    "1001111001101",
        "1011001011110",
        "0100111000000",
        "1001011001111",
        "1110100011111",
        "1011000001110",
        "1111111110011"
        );
 
begin
process (clk)
    variable tag   : std_logic_vector(5-1 downto 0);
        variable index : integer range 0 to 6;
        
        variable data_out  : std_logic_vector(8-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(3 downto 0)));
            tag   := addr(10-1 downto 5);
                
                if (index <= cache'high) and (cache(index)(13-1 downto  8 )<= tag) then
                             
                    data_out  := cache(index)(8-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;

desc_232_Task6.pdf

cache_beh.vhdl

bearbeitet von Tionium

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Du muss die Zeile 56 so ändern, dass du den TAG-Anteil des Caches mit dem TAG vergleichst. Nachdem der Tag bei dir 5 Bits lang ist muss der Bereich Bit 11, Bit 10, Bit 9, Bit 8 und Bit 7 umfassen. Richtig wäre die Zeile also so:

 if index <= cache'high and cache(index)(12-1 downto 7) = tag then

Außerdem sollte der Indexbereich größer sein. Der Index setzt sich aus 5 Bitstellen zusammen, sollte daher von 0 bis 31 gehen. Bei 0 bis 25 wird bei der Überprüfung in VELS sicher ein Indexfehler auftreten.

desc_32_Task6.pdf

Vielen Dank, das hat geklappt mit der Zeile 56.

Aber es gibt folgende Fehlermeldung beim vergleich der en_read aus.

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'.

Hast du vllt eine Idee.

Danke im Voraus!

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

2 Fehler konte ich schon beheben hab jetzt nur noch stehen:

Error report:

Simulation Error:
** Error: (vsim-3421) Value 8 is out of range 0 to 6.

Hatte in der Angabe rising edge und nicht falling 

 

bearbeitet von Tionium

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

2 Fehler konte ich schon beheben hab jetzt nur noch stehen:

Error report:

Simulation Error:
** Error: (vsim-3421) Value 8 is out of range 0 to 6.

Hatte in der Angabe rising edge und nicht falling 

 

hab mein  variable index : integer range von 6 auf 8 geändert und jetzt kommt der Error:

 

Error report:

Your submitted behavior file does not behave like specified in the task description:
For en_read = '1' and addr= "10011000" the outputs should be data = "11001101" and ch_cm = '1' at the next rising_edge, but your cache returns data = "ZZZZZZZZ" and ch_cm = '0' at the next rising_edge.

cache_beh.vhdl

desc_232_Task6.pdf

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

hab mein  variable index : integer range von 6 auf 8 geändert und jetzt kommt der Error:

 

Error report:

Your submitted behavior file does not behave like specified in the task description:
For en_read = '1' and addr= "10011000" the outputs should be data = "11001101" and ch_cm = '1' at the next rising_edge, but your cache returns data = "ZZZZZZZZ" and ch_cm = '0' at the next rising_edge.

cache_beh.vhdl

desc_232_Task6.pdf

In deinem Code steht ..

if (index <= cache'high) and (cache(index)(13-1 downto 0) <= tag) then

aber es sollte heißen 

if (index <= cache'high) and (cache(index)(13-1 downto 0) = tag) then

also der Vergleich auf Gleichheit beim TAG, keine Zuweisung !

desc_32_Task5.pdf

bearbeitet von oreset

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Das habe ich schon vor Stunden geändert, war aber nicht das Problem

bearbeitet von Tionium

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Das habe ich schon vor Stunden geändert, war aber nicht das Problem

Kannst du den Code, der den Fehler verursacht, noch einmal hochladen.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben (bearbeitet)

Kannst du den Code, der den Fehler verursacht, noch einmal hochladen.

Das kommt immer noch.

 

Error report:

Your submitted behavior file does not behave like specified in the task description:
For en_read = '1' and addr= "10011000" the outputs should be data = "11001101" and ch_cm = '1' at the next rising_edge, but your cache returns data = "ZZZZZZZZ" and ch_cm = '0' at the next rising_edge.

Hab den Hinweis bekommen:

Nach meiner Angabe nach benötige ich für den Cache Index 3 Bit der Adresse. Die restlichen 5 Bit ergeben den Tag. Die Adresse muss von mir muss dementsprechend aufgeteilt werden.

(8-1 downto  3) und (3 downto 0) überschneiden sich jedoch und können so daher nicht stimmen.

Weiß aber trotzdem nicht wo der Fehler liegt und was ich anpassen muss.

 

cache_beh.vhdl

bearbeitet von Tionium

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Das kommt immer noch.

 

Error report:

Your submitted behavior file does not behave like specified in the task description:
For en_read = '1' and addr= "10011000" the outputs should be data = "11001101" and ch_cm = '1' at the next rising_edge, but your cache returns data = "ZZZZZZZZ" and ch_cm = '0' at the next rising_edge.

Hab den Hinweis bekommen:

Nach meiner Angabe nach benötige ich für den Cache Index 3 Bit der Adresse. Die restlichen 5 Bit ergeben den Tag. Die Adresse muss von mir muss dementsprechend aufgeteilt werden.

(8-1 downto  3) und (5 downto 0) überschneiden sich jedoch und können so daher nicht stimmen.

Weiß aber trotzdem nicht wo der Fehler liegt und was ich anpassen muss.

 

cache_beh.vhdl

Ok, der Fehler liegt hier: 

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

richtig wäre bei 3 Bit Adresse (Index):

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Geschrieben

Ok, der Fehler liegt hier: 

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

richtig wäre bei 3 Bit Adresse (Index):

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

jAAAAAAAAAAAAAAAAAAAAAAAA DAAAAAAAAAAAAAAAANNNNNNNNNNNNKKKKKKKKKKKKKEEEEEEEE 6h und endlich fertig mit dem BSP Danke. 

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