原创 【博客大赛】BJ-EPM CPLD入门套件VHDL例程5

2012-5-4 09:46 1853 12 12 分类: FPGA/CPLD


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

文章评论0条评论)

登录后参与讨论
我要评论
0
12
关闭 站长推荐上一条 /2 下一条