将异或数据作为函数实现的VHDL
我正在尝试将简单代码打包到函数中。 以下是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 := (
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,而不是新的函数声明。