题目描述:已知d为一个8位数,请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输入的d有效(d给出的信号的上升沿表示写入有效)
信号示意图:
时序图:
本题注意事项:
1)明确在用Verilog描述硬件电路的时候,对于乘法和除法的运算,是一种对资源消耗比较大的操作,因此,在实际设计电路的时候应当尽可能的减少使用乘除运算。本题中,我们可以看出来讲输入数据进行移位再做减法更加简单,如下:
out <= (din<<2)-din; //表示的将输入数据乘以3
out <= (din<<3)-din; //表示将输入数据乘以7
out <= (din<<3); //表示将输入数据乘以8
2)根据对时序图的分析可以知道,需要一个变量对时钟上升沿进行保存,在不同计数的时钟上升沿,输出的数据是不同的,我们选择case语句表示不同语句情况下的输出状态。
代码展示:
reg[1:0] count;
reg [7:0] din;
always@ (posedge clk or negedge rst) begin
if(!rst) begin
out<= 0;
input_grant <= 0;
count <= 0;
din <= 0;
end
else begin
count <= count+1;
case(count)
2'b00: begin din <= d; out <= d; input_grant <= 1; end
2'b01: begin out <= (din<<2)-din; input_grant <= 0; end
2'b10: begin out <= (din<<3)-din; input_grant <= 0; end
2'b11: begin out <= (din<<3); input_grant <= 0;end
endcase
end
end