Код VHDL для ошибки двоичного деления

Я написал код для двоичного делителя, который принимает 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 загруженное изображение

На картинке видно, что мои регистры для делителя и делимого загружаются правильно. Поэтому я думаю, что проблема в фактическом коде деления. Конечный автомат тоже вроде бы работает корректно.


person user3582919    schedule 28.04.2014    source источник
comment
Какие неправильные результаты? Мы не собираемся читать стену кода, чтобы попытаться угадать, в чем проблема.   -  person Marc B    schedule 29.04.2014
comment
У меня действительно нет синтаксических ошибок. Я обнаружил, что мой код в основном выдает неверные результаты для моих входных данных.   -  person user3582919    schedule 29.04.2014
comment
точно. наблюдение за вводом и неправильным выводом может сказать нам многое.   -  person Marc B    schedule 29.04.2014
comment
Только что выложил скриншот своих сигналов. Спасибо за вашу помощь!   -  person user3582919    schedule 29.04.2014


Ответы (1)


Не пишите это сами. Вы заново изобретаете колесо.

Либо напишите q <= a / b;

или используйте IP-ядро от вашего поставщика FPGA.

person Philippe    schedule 30.04.2014