使用VHDL的算法中的逻辑输出错误
我正在尝试做一个验证素数的算法。为此,我必须使用RTL设计方法制作一个电路,我使用下面的算法来获得素数:使用VHDL的算法中的逻辑输出错误,vhdl,primes,quartus,Vhdl,Primes,Quartus,我正在尝试做一个验证素数的算法。为此,我必须使用RTL设计方法制作一个电路,我使用下面的算法来获得素数: int prime (int x) { int i, div; div = 0; for (i = 1; i <= x; i++){ if (mod(x, i) == 0) div++; } if (div == 2) return 1; // PRIME else return 0; // NPRIME } 我的控件比较输入C(输入C
int prime (int x) {
int i, div;
div = 0;
for (i = 1; i <= x; i++){
if (mod(x, i) == 0)
div++;
}
if (div == 2)
return 1; // PRIME
else
return 0; // NPRIME
}
我的控件比较输入C
(输入C从测试台开始。翻译“算法”变成VHDL函数-最后4行变成return div=2;
,所以这并不困难。现在您有了一个黄金模型,TB可以将RTL模型的输出与之进行比较。然后从那里开始逐步细化。StateT、i_RST和w_AUX不会显示在波形中。没有读卡器,您无法复制问题不要完全插入指令,要求有根据的猜测。这里有一个-你没有用i_RST初始化w_AUX,它的初始值是左整数(它是无约束的),您的模拟时间不够长,无法达到w_AUX=2。在您的问题中提供足够的信息也可以在没有任何人猜测的情况下为您指出问题。什么VHDL模拟器不能做一个测试?@user1155120我已经更新了原始帖子,很抱歉丢失了波形。现在还有一个疑问,我可以用quartus或我自动生成一个testbanch吗必须手动执行此操作?我希望通过此波形,您可以复制我的问题。在函数primeif(x%I==0)//WAS-if(mod(x,I)==0)
。您计算次数x
模非零I
等于0(质数只除以1,本身没有余数(=0),这是如何div
结束的2)。i_C从何而来?(为什么在循环的三次中它都很高?)没有对stateT(或verifica\u primo\u控件的任何输出)的for_reg依赖。你的设计规范片段似乎没有实现Cprime
。1)我不明白你说什么,你是说我在做x模0?2) 我在模拟中创建的C值,就像我在描述中说的,这个值来自一个比较器块(比较器块验证mod块的输出是否等于0,如果等于0,控件上的i_C获得值1,如果mod块的输出不同于0,i_C获得值0。从测试台开始。转换该“算法”变成VHDL函数-最后4行变成return div=2;
,所以这并不困难。现在您有了一个黄金模型,TB可以将RTL模型的输出与之进行比较。然后从那里开始逐步细化。StateT、i_RST和w_AUX不会显示在波形中。没有读卡器,您无法复制问题不要完全插入指令,要求有根据的猜测。这里有一个-你没有用i_RST初始化w_AUX,它的初始值是左整数(它是无约束的),您的模拟时间不够长,无法达到w_AUX=2。在您的问题中提供足够的信息也可以在没有任何人猜测的情况下为您指出问题。什么VHDL模拟器不能做一个测试?@user1155120我已经更新了原始帖子,很抱歉丢失了波形。现在还有一个疑问,我可以用quartus或我自动生成一个testbanch吗必须手动执行此操作?我希望通过此波形,您可以复制我的问题。在函数primeif(x%I==0)//WAS-if(mod(x,I)==0)
。您计算次数x
模非零I
等于0(质数只除以1,本身没有余数(=0),这是如何div
结束的2)。i_C从何而来?(为什么在循环的三次中它都很高?)没有对stateT(或verifica_primo_控制的任何输出)的for_reg依赖。您的设计规范片段似乎没有实现Cprime
.1)我不明白你说什么,你是说我在做x mod 0?2)我在模拟中创建的C值,就像我在描述中说的,这个值来自一个比较器块(比较器块验证mod块的输出是否等于0,如果等于0,控件上的i_C获得值1,如果mod块的输出不同于0,i_C获得值0。
for_reg --> register that control the loop for of the prime algorithm (have a flag to indicate when the loop ends)
buffer --> Makes the output equal the input
modulo --> Get the mod of the div from the two inputs
comp --> Compare the output from modulo (if equal 0 the output of compare goes 1 else 0).
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
use IEEE.std_logic_arith.ALL;
ENTITY verifica_primo_control IS
PORT (
i_CLK : IN STD_ULOGIC;
i_RST : IN STD_LOGIC;
i_C : IN STD_LOGIC;
i_FLAG : IN STD_LOGIC;
o_DOUT : OUT STD_LOGIC
);
END verifica_primo_control;
ARCHITECTURE arch_1 OF verifica_primo_control IS
TYPE state_type IS (s0, s1, s2, s3);
SIGNAL stateT : state_type;
SIGNAL w_AUX : integer;
BEGIN
PROCESS(i_CLK)
BEGIN
IF rising_edge(i_CLK) THEN
IF (i_RST = '1') THEN
stateT <= s0;
w_aux <= 0;
ELSE
CASE stateT IS
when s0 => IF (i_C = '1') THEN
stateT <= s1;
ELSE
stateT <= s3;
END IF;
when s1 => w_AUX <= w_AUX +1;
if (i_FLAG = '1') then
stateT <= s2;
else
stateT <= s0;
end if;
when s2 => IF (w_AUX = 2) THEN
o_DOUT <= '1';
ELSE
o_DOUT <= '0';
END IF;
when s3 =>
if (i_FLAG = '1') then
stateT <= s2;
else
stateT <= s0;
end if;
END CASE;
END IF;
END IF;
END PROCESS;
END arch_1;
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_unsigned.ALL;
use IEEE.std_logic_arith.ALL;
ENTITY for_reg IS
PORT (
i_CLR : IN STD_LOGIC;
i_CLK : IN STD_ULOGIC;
i_X : IN UNSIGNED (7 downto 0); -- number input to verify if its prime
i_I : IN UNSIGNED (7 downto 0) ;
o_FLAG : OUT STD_LOGIC;
o_II : OUT UNSIGNED (7 downto 0)
);
END for_reg;
ARCHITECTURE arch_1 OF for_reg IS
signal w_AUX : unsigned (7 downto 0);
BEGIN
PROCESS(i_CLK)
BEGIN
IF rising_edge(i_CLK) THEN
IF (i_CLR = '1') THEN
o_II <= "00000000";
w_AUX <= "00000000";
o_FLAG <='0';
ELSIF (i_CLR ='0' AND i_I < i_X) THEN
w_AUX <= i_I;
o_II <= w_AUX + "00000001";
o_FLAG <='0';
ELSIF (i_CLR = '0' AND i_I = i_X) THEN
o_II <= i_I;
o_FLAG <= '1';
END IF;
END IF;
END PROCESS;
END arch_1;