需要帮助将verilog转换为vhdl

时间:2014-12-23 17:21:32

标签: vhdl

请任何人帮助我将以下Verilog转换为vhdl。谢谢。

//Module to inject errors into Hamming Code
 module InjectError(input [7:0] Din,
input [4:0] Pin,
output [7:0] Dout,
output [4:0] Pout,
input [12:0] Ein);
 assign {Dout, Pout} = {Din, Pin} ^ Ein;
 endmodule

2 个答案:

答案 0 :(得分:2)

阵列聚合的使用是依赖于VHDL的标准版本合规性,如果您打算合成依赖于综合工具中的版本支持。

VHDL实体和体系结构对也对应于Verilog模块;

library ieee;
use ieee.std_logic_1164.all;

entity InjectError is
    port (
        Din:        in  std_logic_vector  (7 downto 0);
        Dout:       out std_logic_vector  (7 downto 0);
        Pin:        in  std_logic_vector  (4 downto 0);
        Pout:       out std_logic_vector  (4 downto 0);
        Ein:        in  std_logic_vector (12 downto 0)
    );
end entity;
architecture foo of InjectError is
begin
-- always works:
    Dout <= Din xor Ein(12 downto 5);
    Pout <= Pin xor Ein(4 downto 0);
end architecture;

使用IEEE Std 1076-1993中的聚合信号分配代替架构主体中显示的两个并发信号分配语句(这也总是有效):

( Dout(7),Dout(6),Dout(5),Dout(4),Dout(3),Dout(2),Dout(1),Dout(0),
  Pout(4),Pout(3),Pout(2),Pout(1),Pout(0) ) <=
          ( Din(7),Din(6),Din(5),Din(4),Din(3),Din(2),Din(1),Din(0),
          Pin(4),Pin(3),Pin(2),Pin(1),Pin(0) ) xor Ein;

其中聚合元素大小必须与右侧的元素大小相匹配,这也符合规则(并且适用于所有地方):

( Dout(7),Dout(6),Dout(5),Dout(4),Dout(3),Dout(2),Dout(1),Dout(0),
  Pout(4),Pout(3),Pout(2),Pout(1),Pout(0) ) <= (Din & Pin) xor Ein;

必须命名赋值基本操作的目标,以便信号分配左侧的连接不起作用。

IEEE Std 1076-2008在9.3.3.3阵列聚合中添加了第2段:

  

对于具有离散范围的选择的元素关联和聚合的元素类型的表达式,表达式的值是该范围中每个索引值处的元素。

允许具有不匹配索引范围的切片或聚合元素(DoutPoutDinPin):

(Dout, Pout) <= (Din, Pin) xor Ein;

看起来更像Verilog-ish,但再次是综合工具VHDL版本支持依赖。

选择端口类型std_logic_vector以利用模拟和综合中的常规混合语言支持,其中std_ulogic和wire之间的映射已被广泛接受。

答案 1 :(得分:1)

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.numeric_std.ALL;

ENTITY error_injector IS
    PORT
    (
        d_in    : IN STD_LOGIC_VECTOR (7 DOWNTO 0);    
        p_in    : IN STD_LOGIC_VECTOR (4 DOWNTO 0);
        d_out   : OUT STD_LOGIC_VECTOR (7 DOWNTO 0);
        p_out   : OUT STD_LOGIC_VECTOR (4 DOWNTO 0);
        e_in    : IN STD_LOGIC_VECTOR (12 DOWNTO 0)
    );
END ENTITY error_injector;

ARCHITECTURE rtl OF error_injector IS
    SIGNAL tmp      : STD_LOGIC_VECTOR (12 DOWNTO 0);
BEGIN
    tmp <= (d_in & p_in) XOR e_in;
    d_out <= tmp(12 DOWNTO 5);
    p_out <= tmp(4 DOWNTO 0);
END;