题解 | 移位运算与乘法
移位运算与乘法
https://www.nowcoder.com/practice/1dd22852bcac42ce8f781737f84a3272?tpId=301&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Foj%3FquestionJobId%3D7%26subTabName%3Donline_coding_page
`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 <= 2'b00;
else
cnt <= cnt + 1;
end
//capture d
reg [7:0] d1;
always @ (posedge clk or negedge rst) begin
if (!rst)
d1<= 8'b0;
else if (cnt==2'b00)
d1<=d;
end
always @ (posedge clk or negedge rst) begin
if (!rst)
out <= 11'b0;
else if (cnt ==2'b00)
out <= d ;
else if (cnt == 2'b01)
out <= d1 + (d1<<1);
else if (cnt == 2'b10)
out <= d1+(d1<<1)+(d1<<2);
else
out <= d1<<3;
end
always @ (*) begin
input_grant = 0;
input_grant = cnt == 2'b01;
end
//*************code***********//
endmodule
本题有以下几个要点:
- 复位:异步复位,低有效;
- 由于存在乘1/3/7/8的周期性规律,因此可以采用计数器才控制周期0-1-2-3,共计四个周期;
- 从d输入值为128而out输出6可以看出输入d对于周期性的乘法操作来说并非实时有效的;
- 从波形上来看input_grant在进行乘1运算时输出高电平
- 综合以上分析,利用计数器控制周期性乘法操作,当计数器为0时out输出乘1值同时采样d记作d1,当计数器为1时d1*3,当计数器为2时d1*7,当计数器为3时d1*8,四个周期一循环,增加了计数器和d1的时序图如下:
{signal: [
{name: 'clk', wave: 'P................'},
{name: 'rst', wave: '01...............'},
{name: 'd', wave: '2...2....222.....',data:['143','7','6','128','129']},
{name: 'cnt', wave: '2.222222222222222',data:['0','1','2','3','0','1','2','3','0','1','2','3','0','1','2','3','0']},
{name: 'd1', wave: '2.2...2...2...2..',data:['0','143','7','6','129']},
{name: 'out', wave: '2.222222222222222',data:['0','143','429','1001','1144','7','21','49','56','6','18','42','48','129','387','903']},
{name:'input_grant',wave:'0.10..10..10..10.'}
]}
https://wavedrom.com/editor.html
此外,采用移位运算符号实现乘除法
a = b<<1,左移一位,表示乘以2
a = b>>1,右移一位,表示除以2
如何遇到奇数的乘除法怎么办?进行拆分!
乘以3,拆分成 a + a*2 ;
乘以7,拆分成 a + a*2+ a*4 ;
