Коллега и я работаем над проектом курса для вычисления GCD (большего общего делителя) из N чисел, используя VHDL.Мы используем алгоритм Евклида и написали следующий код:
P1: process(clk,rstN)
begin
if (rstn = '1') then
CS <= redy;
eqsig <= '0';
x <= (others => '0');
y <= (others => '0');
elsif (clk'EVENT and clk = '1') then
CS <= NS;
end if;
end process P1;
P2: process(CS,eqsig,NS)
begin
case CS is
when redy =>
NS <= inpt;
when inpt =>
NS <= comp;
when comp =>
if (eqsig = '1') then
NS <= otpt;
else
NS <= oper;
end if;
when oper =>
NS <= comp;
when otpt =>
NS <= redy;
when others =>
NS <= redy;
end case;
end process P2;
P3: Process(CS,eqsig)
begin
case CS is
when oper =>
if x<y then
y <= y-x;
elsif y<x then
x <= x-y;
end if;
when comp =>
if x=y then
eqsig <= '1';
else
eqsig <= '0';
end if;
when otpt =>
if (rden = '1') then
rdata <= x;
end if;
when inpt =>
if (wren'EVENT and wren = '1') then
if (waddr = "00") then
x <= wdata;
end if;
end if;
if (wren'EVENT and wren = '0') then
if (waddr = "01") then
y <= wdata;
end if;
end if;
when others =>
null;
end case;
end process P3;
При попытке смоделировать его, он показывает, что вывод «U», хотя код кажется правильным без ошибок, и он может прочитатьвходы.Вот испытательный стенд:
rstN <= '0' after 10 ns;
wren <= '1' after 10 ns, '0' after 70 ns;
wdata <= "00000000000000000000000000000011" after 20 ns,
"00000000000000000000000000000110" after 60 ns;
waddr <= "00"after 20 ns,
"01"after 60 ns;
rden <= '1' after 90 ns;
clk_process : process
begin
clk <= '0' ;
wait for cp/2;
clk <= '1';
wait for cp/2;
end process;
Большое вам спасибо.BR // Ди