Мне нужно реализовать цифровую схему в виде блока потока данных и управления, чтобы вычислить всю часть логарифма по основанию 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;