基于FPGA的任意位宽乘法器VHDL代码Quartus仿真

本文介绍了一种使用VHDL语言在FPGA上设计的可调位宽乘法器,通过通用参数N支持不同位宽。代码展示了如何使用状态机进行操作,包括输入乘数、状态转换和乘积存储。文章最后介绍了Quartus的编译和仿真过程。
摘要由CSDN通过智能技术生成

名称:基于FPGA的任意位宽乘法器VHDL代码Quartus仿真(文末获取)

软件:Quartus

语言:VHDL

代码功能:

任意位宽乘法器

设计一个任意位宽乘法器,通过可调参数N,可以配置为任意位宽,N可以自由修改

可调参数N定义如下:

N : INTEGER := 16--N位乘法器,N可以自由修改,默认为16位

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. Testbench

6. 仿真图

部分代码展示:

LIBRARY ieee;
   USE ieee.std_logic_1164.all;
   USE ieee.std_logic_unsigned.all;
ENTITY Multiplier_nbit IS
   GENERIC (
      N             : INTEGER := 16--N位乘法器,N可以自由修改,默认为16位
   );
   PORT (
      mult_A        : IN STD_LOGIC_VECTOR(N - 1 DOWNTO 0);--mult_A是乘数,mult_B是被乘数
      mult_B        : IN STD_LOGIC_VECTOR(N - 1 DOWNTO 0);--mult_A是乘数,mult_B是被乘数
      clk           : IN STD_LOGIC;--时钟
      start         : IN STD_LOGIC;--start高电平时输入乘数
      Done          : OUT STD_LOGIC;--乘积计算完成
      mult_product  : OUT STD_LOGIC_VECTOR(2 * N - 1 DOWNTO 0)--乘积
   );
END Multiplier_nbit;
ARCHITECTURE behave OF Multiplier_nbit IS
   
   SIGNAL mult_product_buf : STD_LOGIC_VECTOR(2 * N - 1 DOWNTO 0) := "00000000000000000000000000000000";
   TYPE State_type IS (INIT, ADD, SHIFT);  -- 定义状态
   SIGNAL state : State_Type:=INIT;    -- 创建信号--初始状态为INIT
   SIGNAL mult_B_buf       : STD_LOGIC_VECTOR(2 * N - 1 DOWNTO 0) := "00000000000000000000000000000000"; --临时变量
   SIGNAL Count            : INTEGER := 0;
BEGIN
   
   PROCESS (clk)
   BEGIN
      IF (clk'EVENT AND clk = '1') THEN
         CASE state IS
            WHEN INIT =>
               IF (start = '1') THEN
                  state <= ADD;--start有效跳转到下一个状态ADD
                  mult_B_buf(N - 1 DOWNTO 0) <= mult_B;--取乘数
                  mult_B_buf(2 * N - 1 DOWNTO N) <= "0000000000000000";--临时变量的高16位置0
               ELSE
                  mult_product_buf <= "00000000000000000000000000000000";
                  Count <= 0;
                  Done <= '0'; --运算未完成
                  state <= INIT;--初始状态
               END IF;
源代码

 扫描文章末尾的公众号二维码

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
16位乘法器芯片verilog设计实验Quartus9.1工程源码+设计说明文件,可以做为的学习实验设计参考。 module mux16( clk,rst_n, start,ain,bin,yout,done ); input clk; //芯片的时钟信号。 input rst_n; //低电平复位、清零信号。定义为0表示芯片复位;定义为1表示复位信号无效。 input start; //芯片使能信号。定义为0表示信号无效;定义为1表示芯片读入输入管脚得乘数和被乘数,并将乘积复位清零。 input[15:0] ain; //输入a(被乘数),其数据位宽为16bit. input[15:0] bin; //输入b(乘数),其数据位宽为16bit. output[31:0] yout; //乘积输出,其数据位宽为32bit. output done; //芯片输出标志信号。定义为1表示乘法运算完成. reg[15:0] areg; //乘数a寄存器 reg[15:0] breg; //乘数b寄存器 reg[31:0] yout_r; //乘积寄存器 reg done_r; reg[4:0] i; //移位次数寄存器 always@(posedge clk) begin if(!rst_n) begin areg <= 16'h0000; breg <= 16'h0000; done_r <= 1'b0; yout_r <= 32'h00000000; i <= 5'd0; end else if(start) //启动运算 begin if(i < 5'd21) i <= i+1'b1; if(i == 5'd0) begin //锁存乘数、被乘数 areg <= ain; breg <= bin; end else if(i > 5'd0 && i < 5'd16) begin if(areg[i-1]) yout_r = {1'b0,yout[30:15]+breg,yout_r[14:1]}; //累加并移位 else yout_r <= yout_r>>1; //移位不累加 end else if(i == 5'd16 && areg[15]) yout_r[31:16] <= yout_r[31:16]+breg; //累加不移位 else if(i == 5'd18) done_r <= 1'b1; //乘完成标志位置位 else if(i == 5'd20) done_r <= 1'b0; //乘完成标志位清除 end else i <= 5'd0; end assign done = done_r; assign yout = yout_r;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值