Pracuję nad dekoderem na część większego projektu. Mam dwa liczniki, które działają jako wejście do tego modułu. Jednym z nich liczy się 0 - 15, a kolejne przyrosty raz, gdy pierwszy licznik osiągnie 15. W zależności od wartości liczników, dekoder wyjściowy o innej wartości. Zwykle jest ono albo 0, 1, albo -1, ale czasami musi wynosić 0,707 lub -0,707 i tymczasowo używamy numerów stałych punktów, aby poradzić sobie z tym.
Problemem, który mam, jest to, że z moim kodem testowym nie mogę uzyskać przypisania mojego wyjścia, gdy tylko zacznie działać liczniki. Zredukowałem mój kod symulacyjny do bardzo prostego testu, w którym wyczerpuję i wyłączyć reset i wyłączyć naprawdę szybko, a następnie przypisuję pierwszy licznik, aby wynosić 1, a następnie drugi licznik ma 1, który powinien dokonać dekodera przypisania 1 do wyjścia. To utknęło wyprowadzenie "xxxxxx".
Wcześniej miałem długą listę "indziej, jeśli" oświadczenia wykonujące zadania i miałem ten sam błąd.
Jestem pewien, że błąd jest naprawdę prosty, ale po prostu nie byłem w stanie go zobaczyć.
Kod Verilog:
`timescale 1ns / 1ps
module Decoder_W
(
input clk,
input rst,
input [31:0] counter,
input [31:0] stage_counter,
output reg [31:0] out_W
);
always @ (posedge(clk))
begin
if (rst == 1)
out_W <= 0;
else if (stage_counter == 32'd1)
begin
case (counter)
32'd0: out_W <= 1;
32'd1: out_W <= -1;
32'd2: out_W <= 1;
32'd3: out_W <= -1;
32'd4: out_W <= 1;
32'd5: out_W <= -1;
32'd6: out_W <= 1;
32'd7: out_W <= -1;
32'd8: out_W <= 0;
32'd9: out_W <= 0;
32'd10: out_W <= 0;
32'd11: out_W <= 0;
32'd12: out_W <= 0;
32'd13: out_W <= 0;
32'd14: out_W <= 0;
32'd15: out_W <= 0;
default out_W <= 0;
endcase
end
else if (stage_counter == 32'd2)
begin
case (counter)
32'd0: out_W <= 1;
32'd1: out_W <= 0;
32'd2: out_W <= -1;
32'd3: out_W <= 0;
32'd4: out_W <= 1;
32'd5: out_W <= 0;
32'd6: out_W <= -1;
32'd7: out_W <= 0;
32'd8: out_W <= 0;
32'd9: out_W <= -1;
32'd10: out_W <= 0;
32'd11: out_W <= 1;
32'd12: out_W <= 0;
32'd13: out_W <= -1;
32'd14: out_W <= 0;
32'd15: out_W <= 1;
default out_W <= 0;
endcase
end
else if (stage_counter == 32'd3)
begin
case (counter)
32'd0: out_W <= 1;
32'd1: out_W <= 0;
32'd2: out_W <= 0;
32'd3: out_W <= 32'b11111111111111111110100101100000;
32'd4: out_W <= -1;
32'd5: out_W <= 32'b11111111111111111110100101100000;
32'd6: out_W <= 0;
32'd7: out_W <= 32'b00000000000000000001011010100000;
32'd8: out_W <= 0;
32'd9: out_W <= 32'b11111111111111111110100101100000;
32'd10: out_W <= -1;
32'd11: out_W <= 32'b11111111111111111110100101100000;
32'd12: out_W <= 0;
32'd13: out_W <= 32'b00000000000000000001011010100000;
32'd14: out_W <= 1;
32'd15: out_W <= 32'b00000000000000000001011010100000;
default out_W <= 0;
endcase
end
else
out_W <= 0;
end
endmodule
Testbench:
`timescale 1ns / 1ps
module testbench;
reg clk = 0;
reg rst = 0;
reg [31:0] counter = 0;
reg [31:0] stage_counter = 0;
wire [31:0] out_W = 0;
Decoder_W test
(
.clk(clk),
.rst(rst),
.counter(counter),
.stage_counter(stage_counter),
.out_W(out_W)
);
integer i = 0;
always #5 clk = ~clk;
initial
begin
#10 rst = 0;
#10 rst = 1;
#10 rst = 0;
#10 stage_counter = 1;
#10 counter = 0;
#10 counter = 1;
#30
$finish;
end
endmodule
Wyjście symulacyjne:
2 odpowiedzi
Dostajesz X na produkcję z powodu konwencji. out_W
W Testbench ma 2 sterowniki: wire
, która stale prowadzi 0, a moduł Decoder_W
, który napędza 1 wtedy "HFFFFF_FFFF.
Aby go naprawić, nie przypisz wartości do wire
. Zmiana:
wire [31:0] out_W = 0;
Do:
wire [31:0] out_W;
Out_W jest drutem wyjściowym, więc nie powinieneś go initować. Wypróbuj poniższy kod.
`timescale 1ns / 1ps
module testbench;
reg clk;
reg rst;
reg [31:0] counter;
reg [31:0] stage_counter;
wire [31:0] out_W;
Decoder_W test
(
.clk(clk),
.rst(rst),
.counter(counter),
.stage_counter(stage_counter),
.out_W(out_W)
);
integer i = 0;
always #5 clk = ~clk;
initial
begin
clk = 0;
rst = 0;
counter = 0;
stage_counter = 0;
#10 rst = 1;
#10 rst = 0;
#10 stage_counter = 1;
#10 counter = 0;
#10 counter = 1;
#30
$finish;
end
endmodule
Podobne pytania
Nowe pytania
verilog
Verilog to język opisu sprzętu (HDL) używany do modelowania systemów elektronicznych. Jest najczęściej używany w projektowaniu, weryfikacji i implementacji cyfrowych układów logicznych.