牛客网(移位运算和乘法)

该博客介绍了一个Verilog模块,用于在一个8位数字(d)输入的每个时钟周期内实现该数字乘以1/3/7/8的移位运算。在输入d的上升沿有效时,模块会输出计算结果,并通过input_grant信号通知输入有效。代码中包含了计数器、数据寄存器以及根据计数器值进行不同移位运算的逻辑。
摘要由CSDN通过智能技术生成

移位运算和乘法

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

`timescale 1ns/1ns
module multi_sel(
input [7:0]d ,
input clk,
input rst,
output reg input_grant,
output reg [10:0]out
);
//*************code***********//
    reg [1:0]cnt;
    always@(posedge clk or negedge rst)begin
        if(!rst)
            cnt<=0;
        else
            cnt<=cnt+1'b1;
    end
    reg [7:0] d_reg;
    always@(posedge clk or negedge rst)begin
        if(!rst)begin
            d_reg<=0;
            input_grant<=0;
        end
        else if(cnt==0)begin
            d_reg<=d;
            input_grant<=1;
        end
        else begin
            d_reg<=d_reg;
            input_grant<=0;
        end
    end
    always@(posedge clk or negedge rst)begin
        if(!rst)begin
            input_grant<=0;
            out<=0;
        end
        else begin
            case(cnt)
                2'd0:out<=d;
                2'd1:out<=(d_reg<<2)-d_reg;
                2'd2:out<=(d_reg<<3)-d_reg;
                2'd3:out<=d_reg<<3;
            endcase
        end
    end

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

1、移位运算要加括号()

2、cnt=0,输入d寄存一拍,但是由于cnt=0的下一拍也要输出,寄存的无法使用

        所以cnt=0是时的输出要用d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值