可综合的阶乘计算verilog

根据输入的选择数和数字(最大为5),输出数字的立方、平方或者阶乘,

代码如下

module mux2_1
(
    input   wire        sys_clk,
    input   wire        sys_rst_n,
    input   wire [1:0]  select,
    input   wire [2:0]  num,        //输入的最大数为5
    
    output reg [6:0]    result
);

always@ (posedge sys_clk or negedge sys_rst_n)
    if(!sys_rst_n)
        result <= 7'd0;
    else
        case(select)
            2'b00: result <= num * num * num;   //立方
            2'b01: result <= num * num;     //平方
            2'b10: result <= factorial(num);    //阶乘
            default:result <= 7'd0;
        endcase

function [6:0] factorial;
    input [2:0] n;
    reg [2:0] index; 
    begin
        factorial = 7'd1;
        index = 3'd1;
        if(n == 3'd0 || n == 3'd1)
            factorial = 7'd1;
        else
            while(n != index ) begin
                index = index + 1;
                factorial = factorial * index;
            end
    end
endfunction

endmodule

测试代码testbench

`timescale  1ns/1ns
module tb_mux2_1();
reg sys_clk;
reg sys_rst_n;
reg [1:0] select;
reg [2:0] num;

wire [6:0] result; 


initial
    begin
        sys_clk <= 1'b0;
        sys_rst_n <= 1'b0;
        #20
        sys_rst_n <= 1'b1;
    end

always #10 sys_clk <= ~sys_clk;

always @(posedge sys_clk)
    begin
        select <= {$random} % 4;
        num <= {$random} % 6;
    end
    
mux2_1 mux2_1_inst
(
    .sys_clk         (sys_clk),
    .sys_rst_n       (sys_rst_n),
    .select          (select),
    .num             (num),        //输入最大数为5
                    
    .result          (result)
);

endmodule

波形调试

输出延迟一个时钟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

eachanm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值