VHDL log2 с использованием блока управления и потока данных - PullRequest
0 голосов
/ 14 июля 2020

Мне нужно реализовать цифровую схему в виде блока потока данных и управления, чтобы вычислить всю часть логарифма по основанию 2 положительного числа N, представленного как 8-битовое целое число без знака. Для этого схема несколько раз сдвигает N вправо, пока не будет получено значение 0 (ноль). Результатом расчета будет общее количество выполненных смещений, вычтенное из 1.

Пример: для log2 (18) = log2 (00010010) последовательность вычислений следующая: 00010010 => 00001001 => 00000100 => 00000010 => 00000001 => 00000000

Поскольку было выполнено 5 смещений, log2 (18) = 5-1 = 4.

Фактически, log2 (18) = 4,169925, поэтому ответ «4» для всей части является правильным. Когда вход N равен 0 (ноль), а значение логарифма должно быть –∞, дайте ответ «-1» (1111 в двоичном формате)

Я только начинаю кодировать на VHDL, поэтому предполагаю, что мой код очень плохой, я уже сделал это: но он вообще не работает, и я вроде как не знаю, что еще делать

   library IEEE;

entity log2 is 
    port ( 
        clock, reset : in bit;
        start        : in bit;
        ready        : out bit;
        N            : in bit_vector(7 downto 0);
        logval       : out bit_vector (3 downto 0)
        );
end entity log2;

architecture log2_arch of log2 is

        component log2_UC 
            port (
                reset, start : in bit;
                clock: in bit;
                ready : out bit;    
                N : in bit_vector(7 downto 0);
                logval: in bit_vector(3 downto 0)
            );
        end component;
        
        component log2_FD
            port (
                clock : in  bit; 
                N : in bit_vector(7 downto 0)
            );
        end component;
        
        signal entry: bit_vector(7 downto 0);
        signal result: bit_vector(3 downto 0);  
    
begin
    
    UC: log2_UC port map (
            reset => reset,
            start => start,
            clock => clock,
            ready => ready,
            N => entry,
            logval => result
    );
    
    FD: log2_FD port map (
        clock => clock,
        N => entry
    );
end architecture;
        
    
entity log2_UC is
    port (
        reset, start : in bit;
        clock: in bit;
        ready : out bit;    
        N : in bit_vector(7 downto 0);
        logval: in bit_vector(3 downto 0)
    );
end entity log2_UC;

architecture log2_UC_arch of log2_UC is
  type state_t is (wait0, x1, x2, fins);
  signal next_state, current_state: state_t;
begin
    process(clock, reset)
    begin 
        if reset='1' then
          current_state <= wait0;

        elsif (clock'event and clock='1') then
          current_state <= next_state;
        end if;
      end process;
    
    next_state <=
    wait0 when (current_state = wait0) and (start = '0') else
    x1    when (current_state = wait0) and (start = '1') else
    x2    when (current_state = x1)    and (logval = "1111") 
    ;
      
    logval  <= "1111" when current_state=x1 else '0';



    Ready <= '1' when current_state=fins else '0';
end log2_UC_arch;


entity log2_FD is 
  port (
    clock : in  bit; 
    N : in bit_vector(7 downto 0)
    ); 
end log2_FD;
 
architecture archi of log2_FD is 
  signal reg: bit_vector(7 downto 0); 
  signal logval:  bit_vector(3 downto 0);
  signal ready:  bit;
  
  begin 
    process (clock) 
      begin 
        for i in 0 to 7 loop 
            reg(i) <= N(i); 

        logval <= "1111"; 
        ready <= '0';
        
        for i in 0 to 7 loop
            nor reg(i) <= '0';
        end loop;

        if (clock'event and clock='1') then 
          for i in 7 downto 0 loop 
            reg(i) <= reg(i-1); 
            logval <= logval + 1;
          end loop; 
        end if; 
    end process;
end archi; 
...