-- 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;
|