Я работаю над декодером для части более крупного проекта. У меня есть два счетчика, которые действуют как вход для этого модуля. Один из них считает 0 - 15, а другой - один раз, когда первый счетчик достигает 15. В зависимости от значения счетчиков, декодер выводит другое значение. Обычно это либо 0, 1, либо -1, но иногда это должно быть 0,707 или -0,707, и мы временно используем числа с фиксированной запятой, чтобы справиться с этим.
Проблема, с которой я столкнулся, заключается в том, что с моим тестовым кодом я не могу назначить вывод, как только счетчики начнут работать. Я сократил код симуляции до очень простого теста, где я запускаю сброс и отключение очень быстро, затем назначаю первый счетчик равным 1, а затем второй счетчик равным 1, что должно заставить декодер назначить 1 на выход. Он застрял с выводом «XXXXXX».
До этого у меня был длинный список операторов 'else if', выполняющих назначения, и у меня была та же ошибка.
Я уверен, что ошибка действительно проста, но я просто не смог его увидеть.
Код 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
Испытательный стенд:
`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
Вывод моделирования: