目录:
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 仿真波形
待更新。。。