2016-06-27 16 views
0

Я нашел этот код Verilog для термометрического декодера (в кодировщике кода, но это неправильно).Verilog Decoder с одиночными входами/выходами, а не вектором

Я хочу адаптировать его для каденции, чтобы создать список соединений из него. Моя проблема заключается в том, что фактический код генерирует вход [7: 0] + 1 и выход [3: 0] в каденцию.

То, что я хочу, это модуль с 8 + 1 отдельных входов и 4 отдельных выходов:

module thermometer_encoder_8bit(
out0,out1,out2,out3, // 4-bit binary Output 
in0,in1,in2,in3,in4,in5,in6,in7, // 8-bit Input 
enable  // Enable for the encoder 
); 

input enable; 
input in0,in1,in2,in3,in4,in5,in6,in7; 
output out0,out1,out2,out3; 

reg out0,out1,out2,out3; 
... 

это актуально, неприспособленной код:

module thermometer_encoder_8bit(
    binary_out , // 4 bit binary Output 
    encoder_in , // 8-bit Input 
    enable  // Enable for the encoder 
); 
    output [3:0] binary_out ; 
    input enable ; 
    input [7:0] encoder_in ; 

    reg [3:0] binary_out ; 

    always @ (enable or encoder_in) 
    begin 
    binary_out = 0;     // 0000 0000 
    if (enable) begin 
    case (encoder_in) 

     8'b00000001 : binary_out = 1; // 0000 0001 
     8'b00000011 : binary_out = 2; // 0000 0011 
     8'b00000111 : binary_out = 3; // 0000 0111 
     8'b00001111 : binary_out = 4; // 0000 1111 
     8'b00011111 : binary_out = 5; // 0001 1111 
     8'b00111111 : binary_out = 6; // 0011 1111 
     8'b01111111 : binary_out = 7; // 0111 1111 
     8'b11111111 : binary_out = 8; // 0000 1111 

    endcase 
    end 
    end 

endmodule 

Есть ли возможность, чтобы сделать это легко?

Привет, DaHomer

ответ

0

Первым делом, я не вижу default заявление.

Если вы уверены, что encoder_in содержит только те номера, которые указаны в описании случая, вы можете использовать что-то вроде этого. binary_out = $clog2(encoder_in + 1)

0

Я бы модифицировал существующий код с вашими необходимыми входами и выходами, а затем сделал задания для привязки существующей логики к новым входам и выходам. Я не скомпилировал это, так что возьмите с солью соль.

module thermometer_encoder_8to4(
    out0 , // 4 bit binary Output 
    out1 , 
    out2 , 
    out3 , 
    in0 , // 8-bit Input 
    in1, 
    in2, 
    in3 
    in4, 
    in5, 
    in6, 
    in7 
    enable  // Enable for the encoder 
); 
    output out0 ; 
    output out1; 
    output out2; 
    output out3; 
    input enable ; 
    input in0; 
    input in1; 
    input in2; 
    input in3; 
    input in4; 
    input in5; 
    input in6; 
    input in7; 

    // Keep the binary_out and use this to drive the new non-vector outs... 
    reg [3:0] binary_out ; 

    // Here is where we assign the non-vector outs and non-vector ins. 
    wire [7:0] encoder_in = {in7,in6,in5,in4,in3,in2,in1,in0}; 
    assign {out3,out2,out1,out0} = binary_out; 

    always @ (enable or encoder_in) 
    begin 
    binary_out = 0;     // 0000 0000 
    if (enable) begin 
    case (encoder_in) 

     8'b00000001 : binary_out = 1; // 0000 0001 
     8'b00000011 : binary_out = 2; // 0000 0011 
     8'b00000111 : binary_out = 3; // 0000 0111 
     8'b00001111 : binary_out = 4; // 0000 1111 
     8'b00011111 : binary_out = 5; // 0001 1111 
     8'b00111111 : binary_out = 6; // 0011 1111 
     8'b01111111 : binary_out = 7; // 0111 1111 
     8'b11111111 : binary_out = 8; // 0000 1111 

    endcase 
    end 
    end 

endmodule 

Я добавлю следующее, отметив, что это не было конкретно ваш вопрос, но интересно, если это может быть полезным для вас.

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

thermometer_encoder_8bit u0_ thermometer_encoder_8bit 
(
    binary_out ({out0,out1,out2,out3}), // 4-bit binary Output 
    encoder_in ({in0,in1,in2,in3,in4,in5,in6,in7}), // 8-bit Input 
    enable  (enable) // Enable for the encoder 
);