Potokowanie danych i sygnału valid
Część sekcji Projektowanie RTL i weryfikacja ścieżki Verilog w Coddy. Lekcja 18 z 38.
Potoki potoków rozdzielają pracę między rejestry. Flaga poprawności przesuwa się obok każdego elementu danych, dzięki czemu kolejny etap może odróżnić próbkę od pustego cyklu. Przy przypisaniach nieblokujących późniejszy etap odczytuje poprzednią wartość wcześniejszego etapu na tym samym zboczu. Reset powinien unieważniać pracę będącą w toku.
Odpowiedni fragment; pozostałe deklaracje i połączenia są podane w wyzwaniu.
always @(posedge clk) begin
stage <= data;
stage_valid <= in_valid;
result <= stage;
out_valid <= stage_valid;
endDane i informacja o ich poprawności przechodzą przez taką samą liczbę rejestrów.
Wyrównaj dane i sygnał valid na każdym etapie potoku oraz wyzeruj sygnał valid przy resecie.
Wyzwanie
ŚredniZaimplementuj potok z dwoma etapami rejestrowymi. Na każdym zboczu, gdy reset nie jest aktywny, pierwszy etap przechwytuje wartości a i in_valid. Drugi etap używa poprzednich wartości pierwszego etapu: out_valid przyjmuje swoją poprzednią wartość valid, a y przyjmuje poprzednią wartość danych powiększoną o jeden modulo 256, gdy valid ma wartość prawda, w przeciwnym razie zero. Synchroniczny rst czyści oba etapy i wyjścia. Kolumny wyjściowe: y, out_valid. Wszystkie sygnały sterujące i dane są stabilne przed każdym narastającym zboczem zegara; wyniki są odczytywane po nim.
Uzupełnij design.v i zachowaj nazwy modułów oraz porty. Zablokowany testbench.v dostarcza zmiany wejść i wypisuje wyjścia po ich ustaleniu. Wybiera scenariusz za pomocą argumentu symulatora, takiego jak +CASE=1; standardowe wejście nie jest wymagane. Nie dodawaj do projektu wypisywania, opóźnień ani kończenia symulacji. Oczekiwane wyjście to jeden wiersz wartości dziesiętnych na obserwację, oddzielonych pojedynczą spacją i zakończonych znakiem nowej linii.
Spróbuj swoich sił
module dut (input clk, input rst, input in_valid, input [7:0] a, output reg [7:0] y, output reg out_valid);
// Zastąp ten kod zastępczy własnym projektem.
initial y = 0;
initial out_valid = 0;
endmoduleTa lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Projektowanie RTL i weryfikacja
1Niezawodna logika kombinacyjna RTL
Wartości domyślne zapobiegają zatrzaskomKoder priorytetowyWeryfikacja kodu one-hotBezpieczne dekodowanie casePodsumowanie — router żądań4Sterowany sekwencyjny RTL
Priorytet resetu i zezwoleniaLiczniki nasycającePotokowanie danych i sygnału validWykrywanie próbkowanych zboczyPodsumowanie — licznik zdarzeń2Szerokości i arytmetyka ze znakiem
Zachowywanie bitów przeniesieniaPorównania ze znakiemArytmetyczne przesunięcia w prawoPrzepełnienie i nasyceniePodsumowanie — różnica ze znakiemPoćwicz samodzielnie: Kompilator Verilog online