2012-01-22 4 views
1

Я бы хотел преобразовать следующий код VHDL в Verilog. Но я столкнулся с некоторыми проблемами, как я упоминал здесь compilation error. Может ли кто-нибудь дать мне несколько советов о том, как правильно написать одну и ту же функцию в Verilog?VHDL конвертировать в verilog

Спасибо!

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_arith.all; 
use ieee.std_logic_unsigned.all; 
use work.classic_multiplier_parameters.all; 
entity poly_multiplier is 
port (
    a, b: in std_logic_vector(M-1 downto 0); 
    d: out std_logic_vector(2*M-2 downto 0) 
); 
end poly_multiplier; 


architecture simple of poly_multiplier is 
    type matrix_ands is array (0 to 2*M-2) of STD_LOGIC_VECTOR(2*M-2 downto 0); 
    signal a_by_b: matrix_ands; 
    signal c: std_logic_vector(2*M-2 downto 0); 
begin 

    gen_ands: for k in 0 to M-1 generate 
    l1: for i in 0 to k generate 
     a_by_b(k)(i) <= A(i) and B(k-i); 
    end generate; 
    end generate; 

    gen_ands2: for k in M to 2*M-2 generate 
    l2: for i in k to 2*M-2 generate 
     a_by_b(k)(i) <= A(k-i+(M-1)) and B(i-(M-1)); 
    end generate; 
    end generate; 

    d(0) <= a_by_b(0)(0); 
    gen_xors: for k in 1 to 2*M-2 generate 
    l3: process(a_by_b(k),c(k)) 
     variable aux: std_logic; 
     begin 
     if (k < M) then 
      aux := a_by_b(k)(0); 
      for i in 1 to k loop aux := a_by_b(k)(i) xor aux; end loop; 
     else 
      aux := a_by_b(k)(k); 
      for i in k+1 to 2*M-2 loop aux := a_by_b(k)(i) xor aux; end loop; 
     end if; 
     d(k) <= aux; 
    end process; 
    end generate; 

end simple; 
+2

Там в анализатор-Пер атор для VHDL -> Verilog [здесь] (http://www.syncad.com/verilog_vhdl_translator.htm). Можете попробовать. –

+1

Кроме того, мне интересно, почему вы хотите VHDL -> Verilog? Большинство (если не все) инструменты могут обрабатывать обе вместе (например, Xilinx ISE, ModelSim, инструменты синтеза Cadence, ...). – Darhuuk

+0

@ Darhuuk, я хочу знать, как написать этот тип кода VHDL в verilog. – drdot

ответ

1

Этот раздел кода должен сделать это. Примечание:

  • в вашем коде, постоянная M определяются в отдельный пакет, я переместил его, чтобы быть параметром (Verilog) или общим (VHDL)
  • Verilog чувствительны к регистру, так что вы должны исправить орфографию M, a и b

Verilog код:

module poly_multiplier(a, b, d); 

    parameter M = 0; 

    input [M - 1:0] a; 
    input [M - 1:0] b; 
    output [2 * M - 2:0] d; 

    wire [M - 1:0]  a; 
    wire [M - 1:0]  b; 
    reg [2 * M - 2:0] d; 

    wire [2 * M - 2:0] a_by_b[0:2 * M - 2]; 
    wire [2 * M - 2:0] c; 

    generate 
     genvar   k0; 
     for (k0 = 0; k0 <= M - 1; k0=k0+1) begin : gen_ands 
     genvar i0; 
     for (i0 = 0; i0 <= k0; i0=i0+1) begin : l1 
      assign a_by_b[k0][i0] = a[i0] & b[k0 - i0]; 
     end 
     end 
    endgenerate 

    generate 
     genvar k1; 
     for (k1 = M; k1 <= 2 * M - 2; k1=k1+1) begin : gen_ands2 
     genvar i1; 
     for (i1 = k1; i1 <= 2 * M - 2; i1=i1+1) begin : l2 
      assign a_by_b[k1][i1] = a[k1 - i1 + M - 1] & b[i1 - M + 1]; 
     end 
     end 
    endgenerate 

    always @(*) begin 
     d[0] = a_by_b[0][0]; 
    end 

    generate 
     genvar k2; 
     for (k2 = 1; k2 <= 2 * M - 2; k2=k2+1) begin : gen_xors 
     reg aux; 
     integer i; 
     always @(*) begin : P2 

      if ((k2 < M)) begin 
       aux = a_by_b[k2][0]; 
       for(i = 1; i <= k2; i = i + 1) begin 
        aux = a_by_b[k2][i]^aux; 
       end 
      end 
      else begin 
       aux = a_by_b[k2][k2]; 
       for(i = k2 + 1; i <= 2 * M - 2; i = i + 1) begin 
        aux = a_by_b[k2][i]^aux; 
       end 
      end 
      d[k2] = aux; 
     end 

    end 
    endgenerate 
endmodule 

 Смежные вопросы

  • Нет связанных вопросов^_^