Verilog快速入门(4)—— 移位运算与乘法

Verilog快速入门

(1) 四选一多路器
(2)异步复位的串联T触发器
(3)奇偶校验
(4)移位运算与乘法
(5)位拆分与运算
(6)使用子模块实现三输入数的大小比较
(7)4位数值比较器电路
(8)4bit超前进位加法器电路
(9)优先编码器电路①
(10)用优先编码器①实现键盘编码电路
(11)8线-3线优先编码器
(12)使用8线-3线优先编码器实现16线-4线优先编码器
(13)用3-8译码器实现全减器
(14)使用3-8译码器①实现逻辑函数
(15)数据选择器实现逻辑函数
(16)状态机
(17)ROM的简单实现
(18)边沿检测



一、题目描述

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

信号示意图:
在这里插入图片描述

二、解析与代码

3倍=2倍+1倍 or 4-1
7倍=4倍+2倍+1倍 or 8-1

代码如下:

`timescale 1ns/1ns
module multi_sel(
input [7:0]d ,
input clk,
input rst,
output reg input_grant=0,
output reg [10:0]out=0
);
//*************code***********//
//计数器
reg [1:0]cnt=0;
always@(posedge clk)begin
    if(rst)
        if(cnt==2'd3)
            cnt <= 0;
        else
            cnt <= cnt+1;
    else
        cnt <= 0;
end
reg [7:0]din=0;
always @(posedge clk)begin
    if(rst)
        case(cnt)
            2'b00:begin
            din <= d;
            input_grant <= 1;
            out[10:0] <= {3'b0,d};
            end
            2'b01:begin
                input_grant <= 0;
                out[10:0] <= {3'b0,din} + {2'b0,din[7:0],1'b0};
            end
            2'b10:begin
                input_grant <= 0;
                out[10:0] <= {3'b0,din}  + {1'b0,din[7:0],2'b0} + {2'b0,din[7:0],1'b0};
            end
            2'b11:begin
                input_grant <= 0;
                out[10:0] <= {din[7:0],3'b0};
            end
        endcase
    else begin
        input_grant <= 0;
        out[10:0] <= 0;
        din <= 0;
    end
end
//*************code***********//
endmodule
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
位运算Verilog中有两种类型,即算数位和逻辑位。对于算数位,如果位赋值目标位数多于源数据,对于有符号数右,先用符号位填充多出的位,然后按照各自的位运算方式进行运算。对于无符号数,逻辑位和算数位的效果一致,即用0来补充空缺位。\[1\] 在Verilog中,位运算符可以用来实现数乘操作。例如,当我们要将输入d乘以1时,可以直接赋值给out;当我们要将输入d乘以3时,可以将输入d左2位然后减去d;当我们要将输入d乘以7时,可以将输入d左3位然后减去d;当我们要将输入d乘以8时,可以将输入d左3位。总结如下:(din为中间变量) 数乘位运算: 1d3(din<<2)-din 7(din<<3)-din 8(din<<3) 这样可以实现不同的数乘操作。\[2\] 在Verilog中,位运算的使用方法如下: a >> n; // 右n位 a << n; // 左n位 其中,a代表要进行位的操作数,n代表要动的位数。这两种位运算都用0来填补出的空位。\[3\] #### 引用[.reference_title] - *1* *2* [Verilog学习之位运算乘法设计](https://blog.csdn.net/m0_52529907/article/details/125614685)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Verilog 中的位(算术位, 逻辑位, 循环位)](https://blog.csdn.net/Reborn_Lee/article/details/89813616)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值