-- Filename ﹕ MUX16.vhd
-- Author ﹕ wuhouhang
-- Description ﹕ 16位無符號數的乘法運算
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity MUX16 is
port(
Clk: in STD_LOGIC; --50MHz輸入時鐘
Rst_n: in STD_LOGIC; --低電平復位信號
Mux_en_in: in STD_LOGIC; --乘法器運算使能信號。定義為0表示信號無效;定義為1表示讀入乘數和被乘數,并將乘積復位清零。
Mux_ain: in STD_LOGIC_VECTOR (15 downto 0); --輸入a(乘數),其數據位寬為16bit.
Mux_bin: in STD_LOGIC_VECTOR (15 downto 0); --輸入b(被乘數),其數據位寬為16bit.
Mux_yout: buffer STD_LOGIC_VECTOR (31 downto 0); --乘積輸出,其數據位寬為32bit.
Mux_done_out: out STD_LOGIC --乘法運算完成標志位。1表示乘法運算完成。
);
end entity MUX16;
--640ms計數產生0-F遞增數值
--數碼管段選譯碼顯示
architecture MUX of MUX16 is
signal cnt0_en: STD_LOGIC; --計數器cnt=0標志位
signal areg: STD_LOGIC_VECTOR (15 downto 0); --輸入a(乘數)寄存器
signal breg: STD_LOGIC_VECTOR (15 downto 0); --輸入b(被乘數)寄存器
signal num: STD_LOGIC_VECTOR (3 downto 0); --每640ms遞增數值寄存器
begin
--乘數和被乘數鎖存
process(Clk,Rst_n)
begin
if (Rst_n = '0') then --異步復位
areg <= x"0000";
breg <= x"0000";
elsif (Clk'event AND Clk = '1') then --時鐘上升沿
if (Mux_en_in = '1' AND cnt0_en = '1') then
areg <= Mux_ain;
breg <= Mux_bin;
end if;
end if;
end process;
--移位運算
process(Clk,Rst_n)
variable cnt: integer range 0 to 21;
begin
if (Rst_n = '0') then --異步復位
Mux_yout <= x"00000000";
cnt := 0; --計數器
cnt0_en <= '1';
Mux_done_out <= '0';
elsif (Clk'event AND Clk = '1') then --時鐘上升沿
--乘法運算0-21計數器
if (Mux_en_in = '1' AND cnt < 10#22#) then --啟動計數
cnt := cnt+1;
cnt0_en <= '0';
else --計數清零
cnt := 0;
cnt0_en <= '1';
end if;
--乘法運算操作邏輯
if (cnt = 0) then
Mux_yout <= x"00000000";
elsif (cnt > 1 AND cnt < 18) then
if (areg(cnt-2) = '1') then
Mux_yout(14 downto 0) <= Mux_yout(15 downto 1); --bit14-0累加并移位
Mux_yout(31 downto 15) <= ('0' & Mux_yout(31 downto 16)) + ('0' & breg); --bit31-15累加并移位
--Mux_yout(31) <= '0'; --bit31補0
--yout_r = {{1'b0,yout[31:16]}+{1'b0,breg},yout_r[15:1]};
else
Mux_yout <= '0' & Mux_yout(31 downto 1); --移位不累加
end if;
--elsif (cnt = 17 AND areg(15) = '1') then
--Mux_yout(31 downto 16) <= Mux_yout(31 downto 16) + breg;
end if;
--乘法運算完成標志位Mux_done_out產生邏輯
if (cnt = 19) then
Mux_done_out <= '1';
else
Mux_done_out <= '0';
end if;
end if;
end process;
end architecture MUX;
評論
查看更多