请任何人帮助我将以下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
答案 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段:
对于具有离散范围的选择的元素关联和聚合的元素类型的表达式,表达式的值是该范围中每个索引值处的元素。
允许具有不匹配索引范围的切片或聚合元素(Dout
和Pout
,Din
和Pin
):
(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;