加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSSRSS-巴斯仪表网
您当前的位置:首页 > 设计中心 > 可编程逻辑器件

BJ-EPM CPLD开发板:VHDL入门例程5

时间:2014-05-03  来源:123485.com  作者:9stone


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

分享到:
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
栏目导航->可编程逻辑器件
  • 可编程逻辑器件
  • 传感器技术
  • 推荐资讯
    使用普通运放的仪表放大器
    使用普通运放的仪表放
    3V与5V混合系统中逻辑器接口问题
    3V与5V混合系统中逻辑
    数字PID控制及其改进算法的应用
    数字PID控制及其改进
    恶劣环境下的高性价比AD信号处理数据采集系统
    恶劣环境下的高性价比
    栏目更新
    栏目热门