Я хотел бы выполнить некоторую арифметическую c операцию между числом без знака и номером без знака с фиксированной точкой в VHDL:
signal A : ufixed(11 downto -8);
signal B : unsigned(11 downto 0);
signal C : ufixed(A'range);
Каков наилучший способ выполнения операции арифметии c в целочисленных частях что-то вроде этого:
C <= A - B;
Я не смог найти никакой информации о преобразовании unsigned
в ufixed
при сохранении того же "значения". Нужно ли конвертировать B
в std_logic_vector
, pad 0s и использовать процедуру to_ufixed()
?
Есть ли какой-нибудь вменяемый способ выполнения операций такого типа? Спасибо за любые предложения!
Обновление: добавьте минимальный пример
Я пробовал оба предложения, используя GHDL, но все еще получал ошибку, говорящую: ошибка связанной проверки в (операция присваивания) line.
К сожалению, мне все еще не удается заставить модели работать в моей системе Linux.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.fixed_pkg.all;
entity sub is
port (
A : in ufixed (11 downto -8);
B : in unsigned (11 downto 0);
C : out ufixed (11 downto -8));
end entity;
architecture RTL of sub is
begin
-- C <= A - to_ufixed(B, 11, -8);
C <= A - ufixed(B);
end architecture;
Файл тестового стенда:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.fixed_pkg.all;
entity sub_tb is
end entity sub_tb;
architecture sim of sub_tb is
-- component ports
signal A : ufixed (11 downto -8) := (others => '0');
signal B : unsigned (11 downto 0) := (others => '0');
signal C : ufixed (11 downto -8);
begin -- architecture sim
-- component instantiation
DUT: entity work.sub
port map (
A => A,
B => B,
C => C);
-- waveform generation
WaveGen_Proc: process
begin
A <= "00000000111110000000";
B <= "000000000000";
wait for 100 ns;
B <= "000000000001";
wait for 100 ns;
B <= "000000001110";
end process WaveGen_Proc;
end architecture sim;
ghdl -r --std=08 sub_tb
./sub_tb:error: bound check failure at sub_tb.vhdl:16
./sub_tb:error: simulation failed