2012-04-04 10 views
9

Jestem noob FPGA próbuje nauczyć Verilog. Jak mogę "przypisać" wartość do reg w bloku zawsze, albo jako wartość początkową, albo jako stałą. Próbuję zrobić coś takiego w poniższym kodzie. Wystąpił błąd, ponieważ stała 8-bitowa nie jest liczona jako dane wejściowe. Nie chcę też uruchamiać zawsze zegara. Chcę tylko przypisać rejestr do określonej wartości. Ponieważ chcę, aby było to syntezowalne, nie mogę użyć początkowego bloku. Wielkie dzięki.Przypisywanie początkowej wartości syntezowalnej do reg w Verilog

module top 
(
    input wire clk, 
    output wire [7:0] led 
); 


reg [7:0] data_reg ; 
always @* 
begin 
    data_reg = 8'b10101011; 
end 

assign led = data_reg; 

endmodule 

Odpowiedz

15

Możesz połączyć deklarację rejestru z inicjalizacją.

reg [7:0] data_reg = 8'b10101011; 

Albo można użyć bloku initial

reg [7:0] data_reg; 
initial data_reg = 8'b10101011; 
+0

To działa dla mnie z Xilinx XST. –

+0

@Tim Działa również w syntezatorze Quartus dla Cyclone II Altery. –

+0

@NathanFarrington jest możliwe zainicjowanie reg ze zmienną (powiedzmy parametr wejściowy modułu). Próbowałem zrobić to bezpośrednio jak wyżej, ale to nie działa. – ishan3243

4

Zawsze @ * nigdy nie wyzwolił, ponieważ nie zmieniły się argumenty prawej ręki. Dlaczego nie skorzystać z drutu z przypisem?

module top (
    input wire clk, 
    output wire [7:0] led 
); 

wire [7:0] data_reg ; 
assign data_reg = 8'b10101011; 
assign led  = data_reg; 

endmodule 

Jeśli rzeczywiście potrzebujesz flopa, w którym możesz zmienić wartość, domyślną wartością będzie klauzula reset.

module top 
(
    input  clk, 
    input  rst_n, 
    input [7:0] data, 
    output [7:0] led 
); 

reg [7:0] data_reg ; 
always @(posedge clk or negedge rst_n) begin 
    if (!rst_n) 
    data_reg <= 8'b10101011; 
    else 
    data_reg <= data ; 
end 

assign led = data_reg; 

endmodule 

Nadzieja to pomaga

3

Kiedy chip pobiera zasilanie wszystkich jego rejestry zawierają wartości losowe. Nie można mieć wartości początkowej. To zawsze będzie losowe.

Dlatego właśnie mamy sygnały resetowania, aby zresetować rejestry do znanej wartości. Reset jest kontrolowany przez coś niecałego, a my piszemy nasz kod, aby go użyć.

always @(posedge clk) begin 
    if (reset == 1) begin // For an active high reset 
     data_reg = 8'b10101011; 
    end else begin 
     data_reg = next_data_reg; 
    end 
end 
+5

to co mówisz jest prawdą dla ASIC w ogóle, ale nie dla FPGA specjalnie. Po pobraniu pliku bitowego inicjowane są wszystkie komórki pamięci. Resety często nie są potrzebne lub pomocne w projektach FPGA i prowadzą do większego obszaru i prawdopodobnie niższego Fmax. Najlepszym resetem jest ponowne pobranie pliku bitowego. –

+0

@NathanFarrington Dzięki. Mam podobny problem, który próbuję zrozumieć. Mam rejestr stanu dla FSM, który nie wydaje się zainicjować, chyba że przypisać go do napędu drutu wyjściowego. Otworzyłem inny post [link] (http://stackoverflow.com/questions/10033459/verilog-fpga-use-of-an-unitialized-register). Zachowanie wydaje się być związane z tym, o czym tu mówimy. Może mógłbyś to sprawdzić i powiedzieć mi, co myślisz. Jest to kodowanie Verilog na Xilinx FPGA. Dzięki –

5

Należy użyć co dokumentacja FPGA zaleca. Nie ma przenośnego sposobu inicjowania wartości rejestrów innych niż za pomocą resetowania sieci. To wiąże się z kosztem sprzętu związanego z większością celów syntezy.

Powiązane problemy