早教吧 育儿知识 作业答案 考试题库 百科 知识分享

写了个用Verilog描述的无符号加法器,用移位加实现,但是加法不能用Verilog的加号,只能用自己的加法器模modulemul4bit(A,B,M);//四位乘以四位,结果M为8位.inputwire[3:0]A,B;outputreg[7:0]M;wireCo;regC;wi

题目详情
写了个用Verilog描述的无符号加法器,用移位加实现,但是加法不能用Verilog的加号,只能用自己的加法器模
module mul_4bit(A,B,M); //四位乘以四位,结果M为8位.
input wire [3:0] A,B;
output reg [7:0] M;
wire Co;
reg C;
wire [3:0] S;
adder_4bit a0(M[7:4],A,1'b0,S,Co); // S是四位的结果,Co是进位标志
always @(*) begin
M = {4'b0000,B};
repeat (4)
if(M[0]) begin
C = Co;
M[7:4] = S;
M = M >> 1;
M[7] = C;
end
else M = M >> 1;
end
endmodule
可以保证加法器没错,但是结果是错的...如果把加法器换成加好,也就是
repeat (4)
if(M[0]) begin
{C,M[7:4]} = M[7:4]+A;
M = M >> 1;
M[7] = C;
end
结果就是对的..
感觉我的写法时序有点混乱,请问问题出在哪,应该怎么写?
▼优质解答
答案和解析
这个加法器不是时序加法器,最好加一个时钟信号方便全局时钟统一,很有可能是这一个原因.还有always@(*)括号里面为啥是*
还有一个问题,这个repeat是综合出4个加法器,但是你那个却只是调用了一个加法器.verilog不是C语言,一个always模块内部只要是平行条件的,是并行执行的.千万不要忘了这一点.