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条回答
kdy
1楼-- · 2019-03-26 13:07
呵呵,这两个写法说明你还没深入了解verilog啊!
第一个,out从未变成0,当然为1.
第二个,out不是被赋初值, 而是每个时钟来了都变0.
kdy
2楼-- · 2019-03-26 18:02
月痕说的对,7分频当然是计数到6变0,。
module cntt7(clk,rst,out);
input clk,rst;
output out;
reg[2:0]temp;

always@(posedge clk)
begin
        if(rst)
                temp<=0;
        else
                begin
                        temp<=temp+1;
                        if(temp==6)
                                temp<=0;         
               end
end
wire out = (temp==3'b1);//随便是0-6都行,占空比是1:7的分频
endmodule


可以参考下:http://bbs.eeworld.com.cn/thread-375207-1-1.html
了解下always
allenwang6392
3楼-- · 2019-03-26 22:49
 精彩回答 2  元偷偷看……
kdy
4楼-- · 2019-03-26 23:08
这种写法不是很推荐,
这是因为:实际上always出现了这样的语句
always ()
begin
   co<=0;
   if(sum==6)
   co<=1;
end

这种情况不利于阅读,虽然语法上是成立的。就像C里面的GOTO一样
BTW:对同一个变量在同一个时钟沿赋值不属于阻塞非阻塞的范畴。
kdy
5楼-- · 2019-03-27 02:12
最后说一句 Verilog是支持乘的。都集中在语法的讨论上了,
关键的忘记了。
reg [3:0]a;
reg [3:0]b;
wire [7:0]c= a*b;
这样写就OK了。
后面Espier专区会有专门的文章介绍。怎样利用FPGA中的不同资源完成乘法。
allenwang6392
6楼-- · 2019-03-27 07:41
非常感谢你,很多都是基础的,我也正在学习中。就是这个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

一周热门 更多>