verilog 乘法器求助

2019-03-25 08:21发布

我想做一个乘法器,2位二进制输入a[1:0]  b[1:0]  ,输出端c[3:0],程序如下,但我发现,若a=2,b=2,则c=5; 若a=2,b=3,则c=7,结果总是大1个数。(这样写乘法器,可能繁琐,但是理论上是行得通的,为什么结果就是不对)程序如下:
module mult(a,b,c);
input [1:0] a,b;
output [3:0] c;
reg [3:0]c;
always@(a,b)
begin
if(a==0 || b==0)
c=0;
else if(a==1)
c=b;
else if(b==1)
c=a;
else if(a==2 && b==2)
c=4;
else if(a==2 && b==3)
c=6;
else if(a==3 && b==2)
c=6;
else if(a==3 && b==3)
c=9;
end
endmodule 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
allenwang6392
1楼-- · 2019-03-25 14:37
< / 我刚仿真了一下发现,前仿真输出逻辑都对,后仿真输出总是加了一个,如果在一开始给c=0,则输出就正确,请问verilog里面都要赋初值吗,如果不赋初值,默认是什么?请高手解答一下
kdy
2楼-- · 2019-03-25 20:12
你的组合逻辑太复杂,没有初值寄存器上电默认为0。
建议改成时序的,否则乘法器速度极低;
最快的是查找表。
allenwang6392
3楼-- · 2019-03-26 00:38
 精彩回答 2  元偷偷看……
allenwang6392
4楼-- · 2019-03-26 03:41
谢谢,我另有一个问题,这个程序为什么不能生成一个out为7分频的脉冲,out一直为高。
module cntt7(clk,rst,out);
input clk,rst;
output out;
reg out;
reg[2:0]temp;

always@(posedge clk)
begin
        if(rst)
                temp<=0;
        else
                begin
                        temp<=temp+1;
                        if(temp==7)
                        begin temp<=0;out<=1; end
                end
end
endmodule
allenwang6392
5楼-- · 2019-03-26 04:16
module cntt7(clk,rst,out);
input clk,rst;
output out;
reg out;
reg[2:0]temp;

always@(posedge clk)
begin
        out<=0;
        if(rst)
                temp<=0;
        else
                begin
                        temp<=temp+1;
                        if(temp==7)
                        begin temp<=0;out<=1; end
                end
end
endmodule


即使给out初值赋为0,则out输出一直为0
月痕
6楼-- · 2019-03-26 09:27
把最后的7改成6就可以了

一周热门 更多>