altera_mf.vhd
来自「一个非常好的dc使用书籍 一个非常好的dc使用书籍」· VHDL 代码 · 共 1,443 行 · 第 1/5 页
VHD
1,443 行
process (clock0, clock1, clock2, clock3, aclr0, aclr1, aclr2, aclr3, accum_sload_latent)
begin
if (accum_sload_pipeline_reg = "UNREGISTERED") then
accum_sload_pipe <= accum_sload_latent;
else
if (((accum_sload_pipeline_aclr = "ACLR0") and (aclr0 = '1')) or
((accum_sload_pipeline_aclr = "ACLR1") and (aclr1 = '1')) or
((accum_sload_pipeline_aclr = "ACLR2") and (aclr2 = '1')) or
((accum_sload_pipeline_aclr = "ACLR3") and (aclr3 = '1'))) then
accum_sload_pipe <= '0';
elsif (((accum_sload_pipeline_reg = "CLOCK0") and (clock0 = '1') and clock0'event and (ena0 = '1')) or
((accum_sload_pipeline_reg = "CLOCK1") and (clock1 = '1') and clock1'event and (ena1 = '1')) or
((accum_sload_pipeline_reg = "CLOCK2") and (clock2 = '1') and clock2'event and (ena2 = '1')) or
((accum_sload_pipeline_reg = "CLOCK3") and (clock3 = '1') and clock3'event and (ena3 = '1'))) then
accum_sload_pipe <= accum_sload_latent;
end if;
end if;
end process;
-- ------------------------------------------------------------------------------
-- This process contains 1 register and a combinatorial block (to set sign_a_reg)
-- The signal registered is signa
--
-- The register has an asynchronous clear and a clock enable signal
-- NOTE: the combinatorial block is trigged if sign_reg_a is unregistered and
-- signa changes value
-- ------------------------------------------------------------------------------
process (clock0, clock1, clock2, clock3, aclr0, aclr1, aclr2, aclr3, signa)
begin
if (sign_reg_a = "UNREGISTERED") then
sign_a_reg <= signa;
else
if (((sign_aclr_a= "ACLR0") and (aclr0 = '1')) or
((sign_aclr_a= "ACLR1") and (aclr1 = '1')) or
((sign_aclr_a= "ACLR2") and (aclr2 = '1')) or
((sign_aclr_a= "ACLR3") and (aclr3 = '1'))) then
sign_a_reg <= '0';
elsif (((sign_reg_a = "CLOCK0") and (clock0= '1') and clock0'event and (ena0 ='1')) or
((sign_reg_a = "CLOCK1") and (clock1= '1') and clock1'event and (ena1 ='1')) or
((sign_reg_a = "CLOCK2") and (clock2= '1') and clock2'event and (ena2 ='1')) or
((sign_reg_a = "CLOCK3") and (clock3= '1') and clock3'event and (ena3 ='1'))) then
sign_a_reg <= signa;
end if;
end if;
end process;
-- ------------------------------------------------------------------------------
-- This process contains 1 register and a combinatorial block (to set sign_b_reg)
-- The signal registered is signb
--
-- The register has an asynchronous clear and a clock enable signal
-- NOTE: the combinatorial block is trigged if sign_reg_b is unregistered and
-- signb changes value
-- ------------------------------------------------------------------------------
process (clock0, clock1, clock2, clock3, aclr0, aclr1, aclr2, aclr3, signb)
begin
if sign_reg_b= "UNREGISTERED" then
sign_b_reg <= signb;
else
if (((sign_aclr_b= "ACLR0") and (aclr0 = '1')) or
((sign_aclr_b= "ACLR1") and (aclr1 = '1')) or
((sign_aclr_b= "ACLR2") and (aclr2 = '1')) or
((sign_aclr_b= "ACLR3") and (aclr3 = '1'))) then
sign_b_reg <= '0';
elsif (((sign_reg_b = "CLOCK0") and (clock0= '1') and clock0'event and (ena0 ='1')) or
((sign_reg_b = "CLOCK1") and (clock1= '1') and clock1'event and (ena1 ='1')) or
((sign_reg_b = "CLOCK2") and (clock2= '1') and clock2'event and (ena2 ='1')) or
((sign_reg_b = "CLOCK3") and (clock3= '1') and clock3'event and (ena3 ='1'))) then
sign_b_reg <= signb;
end if;
end if;
end process;
-- -------------------------------------------------------------------------------
-- This process contains 1 register and a combinatorial block (to set sign_a_pipe)
-- The signal registered is sign_a_latent
--
-- The register has an asynchronous clear and a clock enable signal
-- NOTE: the combinatorial block is trigged if sign_pipeline_reg_a
-- is unregistered and sign_a_latent changes value
-- -------------------------------------------------------------------------------
process (clock0, clock1, clock2, clock3, aclr0, aclr1, aclr2, aclr3, sign_a_latent)
begin
if (sign_pipeline_reg_a = "UNREGISTERED") then
sign_a_pipe <= sign_a_latent;
else
if (((sign_pipeline_aclr_a= "ACLR0") and (aclr0 = '1')) or
((sign_pipeline_aclr_a= "ACLR1") and (aclr1 = '1')) or
((sign_pipeline_aclr_a= "ACLR2") and (aclr2 = '1')) or
((sign_pipeline_aclr_a= "ACLR3") and (aclr3 = '1'))) then
sign_a_pipe <= '0';
elsif (((sign_pipeline_reg_a = "CLOCK0") and (clock0= '1') and clock0'event and (ena0 ='1')) or
((sign_pipeline_reg_a = "CLOCK1") and (clock1= '1') and clock1'event and (ena1 ='1')) or
((sign_pipeline_reg_a = "CLOCK2") and (clock2= '1') and clock2'event and (ena2 ='1')) or
((sign_pipeline_reg_a = "CLOCK3") and (clock3= '1') and clock3'event and (ena3 ='1'))) then
sign_a_pipe <= sign_a_latent;
end if;
end if;
end process;
-- -------------------------------------------------------------------------------
-- This process contains 1 register and a combinatorial block (to set sign_b_pipe)
-- The signal registered is sign_b_latent
--
-- The register has an asynchronous clear and a clock enable signal
-- NOTE: the combinatorial block is trigged if sign_pipeline_reg_b
-- is unregistered and sign_b_latent changes value
-- -------------------------------------------------------------------------------
process (clock0, clock1, clock2, clock3, aclr0, aclr1, aclr2, aclr3, sign_b_latent)
begin
if (sign_pipeline_reg_b = "UNREGISTERED") then
sign_b_pipe <= sign_b_latent;
else
if (((sign_pipeline_aclr_b= "ACLR0") and (aclr0 = '1')) or
((sign_pipeline_aclr_b= "ACLR1") and (aclr1 = '1')) or
((sign_pipeline_aclr_b= "ACLR2") and (aclr2 = '1')) or
((sign_pipeline_aclr_b= "ACLR3") and (aclr3 = '1'))) then
sign_b_pipe <= '0';
elsif (((sign_pipeline_reg_b = "CLOCK0") and (clock0= '1') and clock0'event and (ena0 ='1')) or
((sign_pipeline_reg_b = "CLOCK1") and (clock1= '1') and clock1'event and (ena1 ='1')) or
((sign_pipeline_reg_b = "CLOCK2") and (clock2= '1') and clock2'event and (ena2 ='1')) or
((sign_pipeline_reg_b = "CLOCK3") and (clock3= '1') and clock3'event and (ena3 ='1'))) then
sign_b_pipe <= sign_b_latent;
end if;
end if;
end process;
-- ----------------------------------------------------------------------------
-- This block multiplies the two input numbers and sets the result to temp_mult
-- ----------------------------------------------------------------------------
process (mult_a, mult_b, sign_a_reg, sign_b_reg)
variable temp_mult_int : std_logic_vector (width_a + width_b downto 0);
variable neg_a, neg_b, is_signed : std_logic;
begin
is_signed := '0';
if (((representation_a = "SIGNED") and (signa = 'Z')) or (sign_a_reg = '1')) then
neg_a := mult_a (width_a-1);
is_signed :='1';
end if;
if (((representation_b = "SIGNED") and (signb = 'Z')) or (sign_b_reg = '1')) then
neg_b := mult_b (width_b-1);
is_signed :='1';
end if;
if (((representation_a = "SIGNED") and (signa = 'Z')) or (sign_a_reg = '1')) then
if (((representation_b = "SIGNED") and( signb = 'Z')) or (sign_b_reg = '1')) then
temp_mult_int := signed (temp_mult_zero) + (signed (mult_a) * signed (mult_b));
else
temp_mult_int := signed (temp_mult_zero) + (signed (mult_a) * unsigned (mult_b));
end if;
else
if (((representation_b = "SIGNED") and (signb = 'Z')) or (sign_b_reg = '1')) then
temp_mult_int := signed (temp_mult_zero) + (unsigned (mult_a) * signed (mult_b));
else
temp_mult_int := signed (temp_mult_zero) + (unsigned (mult_a) * unsigned (mult_b));
end if;
end if;
temp_mult <= temp_mult_int (width_a + width_b -1 downto 0);
end process;
-- ----------------------------------------------------------------------------
-- This process contains 1 register and a combinatorial block (to set mult_res)
-- The signal registered is mult_out_latent
--
-- The register has an asynchronous clear and a clock enable signal
-- NOTE: the combinatorial block is trigged if multiplier_reg
-- is unregistered and mult_out_latent changes value
-- ----------------------------------------------------------------------------
process (clock0, clock1, clock2, clock3, aclr0, aclr1, aclr2, aclr3, mult_out_latent)
begin
if (multiplier_reg = "UNREGISTERED") then
mult_res <= mult_out_latent;
else
if (((multiplier_aclr= "ACLR0") and (aclr0 = '1')) or
((multiplier_aclr= "ACLR1") and (aclr1 = '1')) or
((multiplier_aclr= "ACLR2") and (aclr2 = '1')) or
((multiplier_aclr= "ACLR3") and (aclr3 = '1'))) then
mult_res <= (others =>'0');
elsif (((multiplier_reg = "CLOCK0") and (clock0= '1') and clock0'event and (ena0 ='1')) or
((multiplier_reg = "CLOCK1") and (clock1= '1') and clock1'event and (ena1 ='1')) or
((multiplier_reg = "CLOCK2") and (clock2= '1') and clock2'event and (ena2 ='1')) or
((multiplier_reg = "CLOCK3") and (clock3= '1') and clock3'event and (ena3 ='1'))) then
mult_res <= mult_out_latent;
end if;
end if;
end process;
process (clock0, clock1, clock2, clock3, aclr0, aclr1, aclr2, aclr3)
-- ------------------------------------------------------------------------
-- This process is only valid if extra_multiplier_latency is greater then 0
-- ------------------------------------------------------------------------
variable head_mult_int: integer := 0;
-- -------------------------------------------------------------
-- This is the main process block that performs the accumulation
-- -------------------------------------------------------------
variable head_result_int : integer := 0;
variable result_full, temp_sum : std_logic_vector (width_result downto 0) := (others => '0');
variable cout_int, overflow_int :std_logic;
variable temp_sum_zero : std_logic_vector (width_result downto 0) := (others => '0');
variable accum_int, addsub_int, signed_int : std_logic;
variable result_temp : std_logic_vector (width_result -1 downto 0);
variable sign_extend : std_logic_vector (width_result - width_a - width_b -1 downto 0) := (others => '0');
variable mult_res_temp : std_logic_vector (width_result -1 downto 0) := (others => '0');
begin
-- ------------------------------------------------------------------------
-- This process is only valid if extra_multiplier_latency is greater then 0
-- ------------------------------------------------------------------------
if ( (((multiplier_aclr= "ACLR0") or (multiplier_reg = "UNREGISTERED")) and (aclr0 = '1')) or
((multiplier_reg /= "UNREGISTERED") and
( ((multiplier_aclr= "ACLR1") and (aclr1 = '1')) or
((multiplier_aclr= "ACLR2") and (aclr2 = '1')) or
((multiplier_aclr= "ACLR3") and (aclr3 = '1')) )) ) then
mult_pipe <= (others => (others => '0'));
mult_full <= (others => '0');
elsif ( (((multiplier_reg = "CLOCK0") or (multiplier_reg = "UNREGISTERED"))
and (clock0= '1') and clock0'event and (ena0 ='1')) or
((multiplier_reg = "CLOCK1") and (clock1= '1') and clock1'event and (ena1 ='1')) or
((multiplier_reg = "CLOCK2") and (clock2= '1') and clock2'event and (ena2 ='1')) or
((multiplier_reg = "CLOCK3") and (clock3= '1') and clock3'event and (ena3 ='1')) ) then
if (extra_multiplier_latency >0) then
head_mult_int := head_mult;
mult_pipe (head_mult_int) <= sign_a_reg & sign_b_reg & acc_sload_reg & addsub_reg & '0' & temp_mult;
head_mult_int := (head_mult_int +1) mod (extra_multiplier_latency);
if (extra_multiplier_latency = 1) then
mult_full <= sign_a_reg & sign_b_reg & acc_sload_reg & addsub_reg & '0' & temp_mult;
else
mult_full <= (mult_pipe(head_mult_int));
end if;
head_mult <= head_mult_int;
end if;
end if;
-- -------------------------------------------------------------
-- This is the main process block that performs the accumulation
-- -------------------------------------------------------------
if (((output_aclr= "ACLR0") and (aclr0 = '1')) or
((output_aclr= "ACLR1") and (aclr1 = '1')) or
((output_aclr= "ACLR2") and (aclr2 = '1')) or
((output_aclr= "ACLR3") and (aclr3 = '1'))) then
temp_sum := (others => '0');
result_pipe <= (others => (others => '0'));
result <= (others => '0');
result_int <= (others => '0');
overflow_int := '0';
overflow <= '0';
elsif (((output_reg = "CLOCK0") and (clock0= '1') and clock0'event and (ena0 ='1')) or
((output_reg = "CLOCK1") and (clock1= '1') and clock1'event and (ena1 ='1')) or
((output_reg = "CLOCK2") and (clock2= '1') and clock2'event and (ena2 ='1')) or
((output_reg = "CLOCK3") and (clock3= '1') and clock3'event and (ena3 ='1'))) then
if (accum_sload = 'Z') then
accum_int := '1';
else
accum_int := accum_sload_pipe;
end if;
-- check if addition flag is to be set
if (((addnsub = 'Z') and (accum_direction = "ADD")) or (addsub_pipe = '1')) then
addsub_int := '1';
else
addsub_int := '0';
end if;
-- check if signed flag is to be set
if ((((representation_b = "SIGNED") and (signb = 'Z')) or (sign_b_pipe = '1')) or
(((representation_a = "SIGNED") and (signa = 'Z')) or (sign_a_pipe = '1'))) then
signed_int := '1';
else
signed_int := '0';
end if;
sign_extend := (others => (signed_int and mult_res (width_a + width_b -1)));
mult_res_temp := sign_extend & mult_res;
if (accum_int ='1') then
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?