Я написал код для двоичного делителя, который принимает 8-битное делимое, 3-битный делитель и дает 5-битное частное (3-битный остаток). Я буквально часами пытался исправить ошибку, которая дает неправильные результаты, но я не смог ее идентифицировать. Любая помощь будет ОЧЕНЬ оценена! Я в основном получаю неправильные ответы на свои входные данные, но я не могу понять, почему. Есть шина, которая принимает значения, и на первом такте, где st равно 1, загружается регистр делимого. На втором такте загружается регистр делителя, и вычисления выполняются для следующих трех тактов.
Сигнал V — это выходной сигнал, указывающий на то, что произошло переполнение (результат не умещается в пять битов частного), my st — это стартовый сигнал для запуска процесса, sh — сдвиговый сигнал для сдвигового регистра. , su — сигнал вычитания для вычитателя.
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
entity Divider is
Port (bus_in: in std_logic_vector(8 downto 0);
St, Clk, reset: in std_logic;
Quotient: out std_logic_vector(4 downto 0);
Remainder: out std_logic_vector(2 downto 0);
v: out std_logic);
end Divider;
architecture Behavioral of Divider is
signal State, NextState: integer range 0 to 5;
signal C, Ld1, Ld2, Su, Sh: std_logic;
signal Divisor: std_logic_vector(2 downto 0);
signal Subout: std_logic_vector(3 downto 0);
signal Dividend: std_logic_vector(8 downto 0);
begin
Subout <= Dividend(8 downto 5) - ('0' & divisor);
C <= not Subout (3);
Remainder <= Dividend(7 downto 5);
Quotient <= Dividend(4 downto 0);
State_Graph: process (State, St, C)
begin
Ld1 <= '0';
Ld2<='0';
v <= '0';
Sh <= '0';
Su <= '0';
case State is
when 0 =>
if (St = '1') then
Ld1 <= '1';
NextState <= 1;
else
NextState <= 0;
end if;
when 1 =>
if (St = '1') then
Ld2 <= '1';
NextState <= 2;
else
Ld2<='1';
NextState <= 2;
end if;
when 2 =>
if (C = '1') then
v <= '1';
NextState <= 0;
else
Sh <= '1';
NextState <= 3;
end if;
when 3 | 4 =>
if (C = '1') then
Su <= '1';
NextState <= State;
else
Sh <= '1';
NextState <= State + 1;
end if;
when 5 =>
if (C = '1') then
Su <= '1';
end if;
NextState <= 0;
end case;
end process State_Graph;
Update: process (Clk)
begin
if Clk'event and Clk = '1' then
State <= NextState;
--if Load = '1' then
-- Dividend <= '0' & bus_in;
--end if;
if Ld1 = '1' then
Dividend <= '0'&Bus_in(7 downto 0);
end if;
if Ld2 = '1' then
Divisor <= Bus_in(2 downto 0);
end if;
if Su = '1' then
Dividend(8 downto 5) <= Subout;
Dividend(0) <= '1';
end if;
if Sh = '1' then --94
Dividend <= Dividend(7 downto 0) & '0';
end if;
end if;
end process update;
end Behavioral;
Вот мой ввод и вывод: [Сигналы]: https://imgur.com/fqfiYJZ 1
На картинке видно, что мои регистры для делителя и делимого загружаются правильно. Поэтому я думаю, что проблема в фактическом коде деления. Конечный автомат тоже вроде бы работает корректно.