2011-10-03 15 views
17

Który kod jest lepszy w pisaniu RAM?Lepszy sposób kodowania pamięci RAM w Verilogu

  1. always przypisywanie data_out wewnątrz bloku:

    module memory(
        output reg [7:0] data_out, 
        input [7:0] address, 
        input [7:0] data_in, 
        input write_enable, 
        input clk 
    ); 
        reg [7:0] memory [0:255]; 
    
        always @(posedge clk) begin 
         if (write_enable) begin 
          memory[address] <= data_in; 
         end 
         data_out <= memory[address]; 
        end 
    
    endmodule 
    
  2. przypisywania data_out użyciu assign oświadczenie:

    module memory(
        output [7:0] data_out, 
        input [7:0] address, 
        input [7:0] data_in, 
        input write_enable, 
        input clk 
    ); 
        reg [7:0] memory [0:255]; 
    
        always @(posedge clk) begin 
         if (write_enable) begin 
          memory[address] <= data_in; 
         end 
        end 
    
        assign data_out = memory[address]; 
    
    endmodule 
    

jakieś zalecenia?

+4

Nie potrzebujesz 16 bitów adresu, aby uzyskać dostęp do 256 lokalizacji pamięci. Powinieneś użyć 'input [7: 0] address;'. – toolic

Odpowiedz

8

To zależy od Twoich wymagań.

  1. Spowoduje to zarejestrowanie danych wyjściowych pamięci. Jeśli syntetyzujesz to do bram, będziesz miał 16 więcej klapek niż w przypadku 2. Oznacza to, że używasz trochę więcej miejsca. Oznacza to również, że twoje wyjście będzie miało mniejsze opóźnienie propagacji w stosunku do zegara niż w przypadku 2. Ponadto dane wyjściowe nie będą dostępne do następnego cyklu zegara.

  2. Twoje dane wyjściowe będą dostępne w tym samym cyklu taktowania, jak zostało napisane, aczkolwiek z dłuższym opóźnieniem propagacji względem zegara.

Musisz zdecydować, którego użyć w oparciu o twoje wymagania.

Trzecią opcją jest użycie wygenerowanej pamięci RAM, która jest twardym makrem. To powinno mieć zalety obszaru, mocy i potencjalnej synchronizacji w obu przypadkach 1 i 2.

5

dodać do odpowiedzi na narzędzie - jeśli użyjesz asynchronicznej metody odczytu (przypadek 2), nie zostanie ona zamodelowana do bloku pamięci RAM w FPGA, ponieważ bloki pamięci RAM we wszystkich głównych architekturach, o których wiem, mają synchroniczny odczyt.

-1

W drugim programie wystąpił błąd kompilacji, ponieważ nie można "przypisać" wartości do "Reg". To daje błąd mówiąc: „Rejestracja jest nielegalne w lewej stałego przyporządkowania

1

Obie formy są poprawne, w zależności od rodzaju szybkiego odbierania chcesz. Zawsze polecam przestrzeganie zasad kodowania Xilinx RAM - jest to dobry sposób na zapewnienie, że kod syntetyzuje odpowiednie konstrukcje FGPA.

Na przykład, twój przykład 1 zostałby zsyntetyzowany w Xilinx BRAM (tj. Dedykowany Block Ram), ponieważ jest to odczyt synchroniczny, a Twój przykład 2 zsyntetyzowałby się w Xilinx Distributed Ram (ponieważ jest to odczyt asynchroniczny).

Zobacz wytyczne dotyczące kodowania w dokumencie Xilinx UG901 (Podręcznik użytkownika Vivado Design Suite) w sekcji Techniki kodowania HDL RAM. Ma również dobry opis różnicy między odczytem synchronicznym a odczytem asynchronicznym dla pamięci RAM.

Powiązane problemy