2016-03-18 4 views
0

Я использовал декодер 4x16, используя Verilog вместе с его тестом. Для каждого случая декодер должен выводить 16-разрядную цифру, только с одним из битов. Я не могу получить все нужные результаты при запуске программы. Вот код для декодера и тестирования, а выход на консоли:Verilog 4x16 Декодер выводит неверные данные

4x16 Decoder:

module Decoder4x16 (input [3:0] select, input enable, output reg [16:0] out); 

always @(select, enable) 
begin 

    if(enable == 1'b0) 
     out = 16'b0000000000000000; 
    else if(enable == 1'b1) 
     if(select == 4'b0000) 
      out <= 16'b0000000000000001; 
     else if(select == 4'b0001) 
      out <= 16'b0000000000000010; 
     else if(select == 4'b0010) 
      out <= 16'b0000000000000100; 
     else if(select == 4'b0011) 
      out <= 16'b0000000000001000; 
     else if(select == 4'b0100) 
      out <= 16'b0000000000010000; 
     else if(select == 4'b0101) 
      out <= 16'b0000000000100000; 
     else if(select == 4'b0110) 
      out <= 16'b0000000001000000; 
     else if(select == 4'b0111) 
      out <= 16'b0000000010000000; 
     else if(select == 4'b1000) 
      out <= 16'b0000000100000000; 
     else if(select == 4'b1001) 
      out <= 16'b0000001000000000; 
     else if(select == 4'b1010) 
      out <= 16'b0000010000000000; 
     else if(select == 4'b1011) 
      out <= 16'b0000100000000000; 
     else if(select == 4'b1100) 
      out <= 16'b0001000000000000; 
     else if(select == 4'b1101) 
      out <= 16'b0010000000000000; 
     else if(select == 4'b111) 
      out <= 16'b0100000000000000; 
     else if(select == 4'b1111) 
      out <= 16'b1000000000000000; 
    end 

endmodule 

Тест:

module Decoder4x16_test; 

reg [3:0] select; 
reg enable; 
wire [16:0] out; 

parameter sim_time = 2800; 

Decoder4x16 decoder(select, enable, out); 
initial #sim_time $finish; 
initial 
begin 
    select = 4'b0000; 
    enable = 1'b0; 

    repeat(16) #10 begin 
     enable = 1'b1; 
     #85 $display("select = %b \t out = %b", select, out); 
     select = select + 4'b0001; 
    end 
end 
endmodule 

При запуске программы она выводит правильный вывод пока он не достигнет тестового примера, где вход 1101. После этого декодер выводит неправильное значение, которое предполагается отображать. Вот результат:

select = 0000 out = 00000000000000001 
select = 0001 out = 00000000000000010 
select = 0010 out = 00000000000000100 
select = 0011 out = 00000000000001000 
select = 0100 out = 00000000000010000 
select = 0101 out = 00000000000100000 
select = 0110 out = 00000000001000000 
select = 0111 out = 00000000010000000 
select = 1000 out = 00000000100000000 
select = 1001 out = 00000001000000000 
select = 1010 out = 00000010000000000 
select = 1011 out = 00000100000000000 
select = 1100 out = 00001000000000000 
select = 1101 out = 00010000000000000 
select = 1110 out = 00010000000000000 
select = 1111 out = 01000000000000000 
+0

У вас есть typo'ed условие: 'else if (select == 4'b111)' должно быть 'else if (select == 4'b1110)' – Morgan

ответ

4

Здесь out является reg, что означает, что он имеет значение, которое присваивается ему. Существует не else if условие для select=4'b1110. Таким образом, outпроводит или сохраняет его предыдущее значение, которое было от select=4'b1101. То есть, out имеет значение 00010000000000000, которое отображается.

Так, добавитьelse if условия для select=4'b1110 и код работает отлично.

else if(select == 4'b1110) 
      out <= 16'b0100000000000000; 

Кроме того, декодер чисто комбинационная схема. При создании любой комбинационной логики предпочтение отдается назначению блокировки (=). Итак, используйте следующий синтаксис. более

else if(select == 4'b1110) 
      out = 16'b0100000000000000; // blocking 

Одно только разработать, использовать [email protected](*) вместо ручного списка чувствительности. Это поможет уменьшить путаницу списков чувствительности.

3

Попробуйте этот простой код,

module Decoder4x16 (input [3:0] select, 
        input enable, 
        output wire [16:0] out); 

assign out = {17{enable}} & (1'b1 << select); 

endmodule 

синтезированный в ISE тоже.