Dalam kursus Desain Logika kita semua belajar bahwa adalah mungkin untuk meminimalkan fungsi logika, misalnya dengan menggunakan peta Karnaugh atau algoritma Quine-McCluskey . Kami juga belajar bahwa nilai "Tidak Peduli" meningkatkan potensi minimalisasi.
Misalnya mengambil file register. The write_address
dan write_data
sinyal tidak terlalu penting ketika write_enable
sinyal '0'
. Dengan demikian, mereka harus diberi nilai "Jangan Peduli" untuk memungkinkan lebih banyak optimasi dalam logika yang menggerakkan sinyal-sinyal ini (yaitu tidak dalam file register itu sendiri).
Apa cara yang benar untuk menentukan nilai "Tidak Peduli" dalam VHDL untuk memungkinkan alat sintesis lebih banyak ruang untuk kemungkinan optimasi?
Sejauh ini saya telah menemukan hal-hal berikut yang mungkin cocok. Tapi saya tidak begitu yakin apa pro dan kontra dari setiap pendekatan:
- Sama sekali tidak menetapkan sinyal. Sepertinya ini bisa berhasil. Namun saya menemukan bahwa itu tidak berfungsi ketika Anda ingin mendefinisikan "melakukan apa-apa yang konstan" dari beberapa
record
jenis, karena catatan konstanta harus sepenuhnya ditentukan (setidaknya Modelsim mengatakan demikian). - The
std_logic_1164
paket mendefinisikan nilai'-' -- Don't care
untukstd_ulogic
. Sepertinya ini adalah pilihan semantik yang benar untuk "tidak peduli" yang eksplisit, tetapi saya belum pernah melihatnya digunakan di mana pun (kecuali dalamcase?
konstruksi VHDL-2008 yang tidak terkait ). - Modelsim menggunakan nilai
'X'
untuk menampilkan sinyal yang tidak ditentukan. Namun saya tidak yakin apakah alat sintesis memahami'X'
penugasan eksplisit sebagai "tidak peduli".
Berikut cuplikan kode yang disederhanakan untuk klarifikasi, tempat saya menginisialisasi sinyal tidak peduli '-'
.
Seperti yang Anda lihat, sinyal control.reg_write_address
dapat memiliki 3 nilai yang berbeda: "----"
, instruction(11 downto 8);
dan instruction(3 downto 0);
. Sekarang saya berharap ini akan disintesis menjadi multiplexer 2-input jika '-'
ditafsirkan sebagai "tidak peduli". Seandainya saya menginisialisasi sinyal dengan (others => '0')
bukannya '-'
, alat harus menghasilkan multiplexer 3-input sebagai gantinya.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
package mytypes is
type control_signals_t is record
write_enable : std_logic;
write_address : std_ulogic_vector(3 downto 0);
read_address : std_ulogic_vector(3 downto 0);
end record;
-- All members of this constant must be fully specified.
-- So it's not possible to simply not assign a value.
constant CONTROL_NOP : control_signals_t := (
write_enable => '0',
write_address => (others => '-'),
read_address => (others => '-')
);
end package;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
library cfx;
use cfx.mytypes.all;
entity control_unit is
port(
instruction : in std_ulogic_vector(15 downto 0);
write_data : out std_ulogic_vector(15 downto 0);
ctrl : out control_signals_t
);
end entity;
architecture rtl of control_unit is
begin
decode_instruction : process(instruction) is
begin
-- Set sensible default values that do nothing.
-- Especially all "write_enable" signals should be '0'.
-- Everything else is mostly irrelevant (don't care).
ctrl <= CONTROL_NOP;
write_data <= (others => '-');
if instruction(15 downto 12) = "1100" then
-- Load 8 bit of data into the register file
ctrl.write_enable <= '1';
write_data <= std_ulogic_vector(resize(signed(instruction(7 downto 0)), 16));
ctrl.write_address <= instruction(11 downto 8);
elsif instruction(15 downto 8) = "11111001" then
-- Load 4 bit of data into the register file
write_data <= std_ulogic_vector(resize(signed(instruction(7 downto 4)), 16));
ctrl.write_address <= instruction(3 downto 0);
elsif instruction(15 downto 8) = "10110101" then
-- Read from the register file. Don't use the write signals at all.
ctrl.read_address <= instruction(3 downto 0);
end if;
end process;
end architecture;
write_address
danwrite_data
? Optimalisasi apa yang Anda harapkan terjadi?