【牛客网刷题系列 之 Verilog快速入门】~ 移位运算与乘法

1. VL4 移位运算与乘法

1.1 题目描述

已知d为一个8位数,请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输入的d有效(d给出的信号的上升沿表示写入有效)

1.1.1 信号示意图

在这里插入图片描述

1.1.2 波形示意图

在这里插入图片描述

1.1.3 输入描述

输入信号 d, clk, rst
类型 wire
在testbench中,clk为周期5ns的时钟,rst为低电平复位

1.1.4 输出描述

输出信号 input_grant out
类型 reg

1.2 解题思路

这个题有两个点:一个是乘法运算怎么解决?还有一个就是怎么保证完成四次乘法运算呢?

1、 我们一般用移位操作来解决乘除法,但需要注意的是,无符号数和有符号数是有区别的:
无符号数===>左移一位表示乘2,右移一位表示除2
有符号数===>只能进行左移操作,不能右移操作,为什么呢?因为右移的话,高位得补0,那岂不是会影响最高位的符号位嘛!!!

2、 解决第二个问题,那得用计数器来完成即可。刚好2位计数器刚刚好,哈哈哈!!!

1.3 代码实现

`timescale 1ns/1ns
module multi_sel(
input [7:0]d ,
input clk,
input rst,
output reg input_grant,
output reg [10:0]out
);
//*************code***********//
    //counter
    reg [1:0] cnt;
    always @ (posedge clk or negedge rst) begin
        if(!rst) begin
           cnt <= 2'b00; 
        end
        else begin
           cnt <= cnt + 1'b1; 
        end
    end
    
    reg [7:0] d_reg;
    always @ (posedge clk or negedge rst) begin
        if(!rst) begin
           out <= 11'd0;
            input_grant <= 1'b0;
            d_reg <= 8'd0;
        end
        else begin
            case (cnt)
                2'b00 : begin
                    out <= d;
                    d_reg <= d;
                    input_grant <= 1'b1;
                end
                2'b01 : begin
                    out <= d_reg + (d_reg<<1);
                    input_grant <= 1'b0;
                end
                2'b10 : begin
                    out <= d_reg + (d_reg<<1) + (d_reg<<2);
                    input_grant <= 1'b0;
                end
                2'b11 : begin
                    out <= d_reg<<3;
                    input_grant <= 1'b0;
                end
                default : begin
                    out <= d;
                    input_grant <= 1'b0;
                end
            endcase
        end
    end

//*************code***********//
endmodule

1.4 测试文件

待更新。。。

1.5 仿真波形

待更新。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值