Menu
Coddy logo textTech

Porty wejściowe i wyjściowe

Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 31 z 90.

Porty wejściowe i wyjściowe to połączenia, które pozwalają modułowi komunikować się ze światem zewnętrznym. Są jak piny układu scalonego. Porty stanowią interfejs między modułem a resztą projektu.

Każdy moduł ma:

  • Porty wejściowe: sygnały, które trafiają do modułu
  • Porty wyjściowe: sygnały, które wychodzą z modułu

Porty wejściowe

Porty wejściowe odbierają dane z zewnątrz. Nie można ich zmieniać wewnątrz modułu: można je tylko odczytywać.

input clk;        // Wejście jednobitowe
input [7:0] data; // 8-bitowy wektor wejściowy
input a, b;       // Wiele wejść w jednej linii

Zasady dotyczące wejść:

  • Nie można przypisać wartości wewnątrz modułu
  • Nie można zadeklarować jako reg
  • Zawsze wire (domyślnie)

Porty wyjściowe

Porty wyjściowe wysyłają dane na zewnątrz. Mogą być sterowane przez bloki assign lub always.

output out;           // Wyjście jednobitowe
output [3:0] result;  // Wyjście 4-bitowe
output reg busy;      // Wyjście może być typu reg
output wire ready;    // Wyjście może być typu wire

Zasady dotyczące wyjść:

  • Może być typu wire (z assign) lub reg (z always)
  • Musi być sterowane przez coś znajdującego się wewnątrz modułu

Składnia deklaracji portów

Składnia deklaracji portów to konkretny sposób zapisywania portów wejściowych i wyjściowych w module. Informuje Verilog o trzech rzeczach dotyczących każdego portu:

  1. Kierunek: czy jest to wejście, wyjście czy wejście/wyjście?
  2. Rozmiar: ile bitów ma szerokości?
  3. Nazwa: jak się nazywa?
module example (
  input [7:0] data_in,    // Wektor wejściowy
  input clk,              // Pojedyncze wejście
  input enable,           // Pojedyncze wejście
  output reg [7:0] out,   // Rejestr wyjściowy
  output busy             // Przewód wyjściowy
);

Dlaczego kierunek portu ma znaczenie

Kierunek informuje Verilog:

  • Które sygnały moduł może odczytywać (wejścia)
  • Które sygnały moduł może zapisywać (wyjścia)
  • Jakie typy połączeń są dozwolone

Użycie niewłaściwego kierunku powoduje błędy kompilacji.

Przykład kodu

module port_demo (
  input [3:0] a,        // Można tylko odczytywać
  input [3:0] b,        // Można tylko odczytywać
  output reg [3:0] sum, // Można zapisywać (reg)
  output [3:0] diff     // Można zapisywać (wire)
);
  always @(*) begin
    sum = a + b;        // Zapis do wyjścia typu reg
  end
  
  assign diff = a - b;   // Zapis do wyjścia typu wire
endmodule
challenge icon

Wyzwanie

Uzupełnij deklaracje portów

Co zrobić:

  1. Dodaj 8-bitowe wejście o nazwie data_in
  2. Dodaj jednobitowe wejście o nazwie clk
  3. Dodaj 4-bitowe wyjście o nazwie result (użyj reg: będzie przypisywane w bloku always)
  4. Dodaj jednobitowe wyjście o nazwie valid (użyj wire: będzie przypisywane za pomocą assign)

Spróbuj swoich sił

module port_challenge (
  // Zadanie 1: Dodaj 8-bitowe wejście o nazwie data_in
  
  
  // Zadanie 2: Dodaj 1-bitowe wejście o nazwie clk
  
  
  // Zadanie 3: Dodaj 4-bitowe wyjście o nazwie result (użyj reg)
  
  
  // Zadanie 4: Dodaj 1-bitowe wyjście o nazwie valid (użyj wire)
  
  
);

  reg [3:0] counter;
  
  always @(posedge clk) begin
    counter <= counter + 1;
    result <= counter;
  end
  
  assign valid = (counter > 8);
  
endmodule
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Kompilator Verilog online