将异或数据作为函数实现的VHDL

将异或数据作为函数实现的VHDL,vhdl,fpga,xilinx,modelsim,Vhdl,Fpga,Xilinx,Modelsim,我正在尝试将简单代码打包到函数中。 以下是VHDL代码: process(CLK, RST) variable newdata : std_logic_vector(7 downto 0) := (others => '0'); variable tempdata : std_logic_vector(7 downto 0) := (others => '0'); begin if (RST = '1') then tempdata := (

我正在尝试将简单代码打包到函数中。 以下是VHDL代码:

process(CLK, RST)
    variable newdata : std_logic_vector(7 downto 0)  := (others => '0');
    variable tempdata : std_logic_vector(7 downto 0) := (others => '0');
begin

    if (RST = '1') then
       tempdata := (others => '0');
       newdata  := (others => '0');
    elsif rising_edge(CLK) then
        tempdata := DIN;    
        newdata  := newdata XOR tempdata;
    end if;
    DOUT <= newdata;
end process;

没有错误,没有警告

在RTL模型上,看起来他是空的数据输入,但我不明白为什么。 有人能解释一下为什么会这样吗?如何正确地创建一个实现我的代码的函数? 谢谢你

下面是函数的调用:

...
signal temp     : std_logic_vector(7 downto 0) := (others => '0');

begin

process(CLK, RST)
begin
    if (RST = '1') then
        temp <= (others => '0');
    elsif rising_edge(CLK) then
        temp <= f_MOD2ALG(DIN);
    end if;
end process;
DOUT <= temp;
...
。。。
信号温度:标准逻辑向量(7到0):=(其他=>“0”);
开始
过程(时钟、RST)
开始
如果(RST='1'),则
温度‘0’;
elsif上升沿(CLK)则

temp正如我在评论中已经写到的,您的代码的问题是,函数中的变量
newdata
将始终是
“uu”
,因为它从未初始化,并且在两次函数调用之间不会保留其值。和你交换一些东西总是会给你

如果将
newdata
初始化为全零,则输出将与输入相对应,因为使用
0
进行异或运算将得到
foo

我知道Easics的CRC发生器。在函数中,它们将前一个CRC值作为参数传递。你可以做类似的事情:

function f_MOD2ALG (foo : std_logic_vector; last_bar: std_logic_vector) 
return std_logic_vector is
    variable new_bar  : std_logic_vector(foo'range);
begin
    new_bar := foo xor last_bar;
    return new_bar;
end function;
并以某种方式称之为:

signal bar : std_logic_vector(31 downto 0) := (others=>'0');
...
process(clk)
begin
   if rising_edge(clk) then
      bar <= f_MOD2ALG(foo, bar);
   end if;
end process;
信号条:标准逻辑向量(31到0):=(其他=>'0');
...
过程(clk)
开始
如果上升沿(clk),则

bar正如我在评论中已经写到的,您的代码的问题是,函数中的变量
newdata
将始终是
“uu”
,因为它从未初始化,并且在两次函数调用之间不会保留其值。和你交换一些东西总是会给你

如果将
newdata
初始化为全零,则输出将与输入相对应,因为使用
0
进行异或运算将得到
foo

我知道Easics的CRC发生器。在函数中,它们将前一个CRC值作为参数传递。你可以做类似的事情:

function f_MOD2ALG (foo : std_logic_vector; last_bar: std_logic_vector) 
return std_logic_vector is
    variable new_bar  : std_logic_vector(foo'range);
begin
    new_bar := foo xor last_bar;
    return new_bar;
end function;
并以某种方式称之为:

signal bar : std_logic_vector(31 downto 0) := (others=>'0');
...
process(clk)
begin
   if rising_edge(clk) then
      bar <= f_MOD2ALG(foo, bar);
   end if;
end process;
信号条:标准逻辑向量(31到0):=(其他=>'0');
...
过程(clk)
开始
如果上升沿(clk),则

bar函数中的变量
newdata
将始终是
“uu”
,因为它从未初始化,并且在两次函数调用之间不会保留其值。与
U
进行异或运算总是会得到
U
。函数中未指定初始状态,数据类型转换为二进制,并假定为“0”。然而,每次对函数的调用都会动态地阐述newdata的声明,它总是“0”,就像在RTL中一样。该函数不实现存储。请参阅IEEE Std 1076-2008 14.6动态精化,16.8标准合成包,16.8.2.4.2强制值和弱值的解释(“0”、“1”、“L”、“H”、FALSE、TRUE)。其目的是解决您的第一个问题。someon能向我解释为什么会发生这种情况吗。不清楚你为什么要坚持使用函数。而不是
temp而不是新函数声明。函数中的变量
newdata
将始终是
“uu”
,因为它从未初始化,并且在两次函数调用之间不会保留其值。与
U
进行异或运算总是会得到
U
。函数中未指定初始状态,数据类型转换为二进制,并假定为“0”。然而,每次对函数的调用都会动态地阐述newdata的声明,它总是“0”,就像在RTL中一样。该函数不实现存储。请参阅IEEE Std 1076-2008 14.6动态精化,16.8标准合成包,16.8.2.4.2强制值和弱值的解释(“0”、“1”、“L”、“H”、FALSE、TRUE)。其目的是解决您的第一个问题。someon能向我解释为什么会发生这种情况吗。不清楚你为什么要坚持使用函数。而不是
temp,而不是新的函数声明。