6917|21

17

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

verilog 乘法器求助 [复制链接]

我想做一个乘法器,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
此帖出自FPGA/CPLD论坛

最新回复

初学者吧?这不是C语言……  详情 回复 发表于 2013-7-25 21:10

点评

我刚仿真了一下发现,前仿真输出逻辑都对,后仿真输出总是加了一个,如果在一开始给c=0,则输出就正确,请问verilog里面都要赋初值吗,如果不赋初值,默认是什么?请高手解答一下  详情 回复 发表于 2013-7-16 16:52
点赞 关注
 

回复
举报

17

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

回复 楼主allenwang6392 的帖子

我刚仿真了一下发现,前仿真输出逻辑都对,后仿真输出总是加了一个,如果在一开始给c=0,则输出就正确,请问verilog里面都要赋初值吗,如果不赋初值,默认是什么?请高手解答一下
此帖出自FPGA/CPLD论坛
 
 

回复

581

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
你的组合逻辑太复杂,没有初值寄存器上电默认为0。
建议改成时序的,否则乘法器速度极低;
最快的是查找表。
此帖出自FPGA/CPLD论坛

点评

module cntt7(clk,rst,out); input clk,rst; output out; reg out; reg[2:0]temp; always@(posedge clk) begin out  详情 回复 发表于 2013-7-17 11:18
谢谢,我另有一个问题,这个程序为什么不能生成一个out为7分频的脉冲,out一直为高。 module cntt7(clk,rst,out); input clk,rst; output out; reg out; reg[2:0]temp; always@(posedge clk) begin if(r  详情 回复 发表于 2013-7-17 11:16
module cntt7(clk,rst,out); input clk,rst; output out; reg out; reg[2:0]temp; always@(posedge clk) begin if(rst) temp  详情 回复 发表于 2013-7-17 11:15
个人签名Net:Wxeda.taobao.com
QQ:1035868547
Blog:https://home.eeworld.com.cn/space-uid-390804.html
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 板凳kdy 的帖子

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
此帖出自FPGA/CPLD论坛
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 板凳kdy 的帖子

谢谢,我另有一个问题,这个程序为什么不能生成一个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
此帖出自FPGA/CPLD论坛
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 板凳kdy 的帖子

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
此帖出自FPGA/CPLD论坛

点评

kdy
呵呵,这两个写法说明你还没深入了解verilog啊! 第一个,out从未变成0,当然为1. 第二个,out不是被赋初值, 而是每个时钟来了都变0.  详情 回复 发表于 2013-7-17 12:26
把最后的7改成6就可以了  详情 回复 发表于 2013-7-17 12:21
 
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 6楼allenwang6392 的帖子

把最后的7改成6就可以了
此帖出自FPGA/CPLD论坛
 
 
 

回复

581

帖子

0

TA的资源

五彩晶圆(初级)

8
 

回复 6楼allenwang6392 的帖子

呵呵,这两个写法说明你还没深入了解verilog啊!
第一个,out从未变成0,当然为1.
第二个,out不是被赋初值, 而是每个时钟来了都变0.
此帖出自FPGA/CPLD论坛
个人签名Net:Wxeda.taobao.com
QQ:1035868547
Blog:https://home.eeworld.com.cn/space-uid-390804.html
 
 
 

回复

581

帖子

0

TA的资源

五彩晶圆(初级)

9
 
月痕说的对,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


可以参考下:https://bbs.eeworld.com.cn/thread-375207-1-1.html
了解下always
此帖出自FPGA/CPLD论坛

点评

谢谢,我是写下面这个程序时,突然想到如何单独生成一个7分频的脉冲,因为下面这个程序的co是一个7分频的脉冲: module cnt7(clk,rst,sum,co); input clk,rst; output[2:0]sum; output co; reg[2:0]sum; reg  详情 回复 发表于 2013-7-17 13:29
个人签名Net:Wxeda.taobao.com
QQ:1035868547
Blog:https://home.eeworld.com.cn/space-uid-390804.html
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

10
 

回复 9楼kdy 的帖子

谢谢,我是写下面这个程序时,突然想到如何单独生成一个7分频的脉冲,因为下面这个程序的co是一个7分频的脉冲:
module cnt7(clk,rst,sum,co);
input clk,rst;
output[2:0]sum;
output co;
reg[2:0]sum;
reg co;

always@(posedge clk)
begin
        co<=0;       
        if(rst)
                sum<=0;
        else
                begin
                        sum<=sum+1;
                        if(sum==6)
                        begin sum<=0; co<=1; end
                end
end
endmodule
此帖出自FPGA/CPLD论坛
 
 
 

回复

581

帖子

0

TA的资源

五彩晶圆(初级)

11
 
这种写法不是很推荐,
这是因为:实际上always出现了这样的语句
always ()
begin
   co<=0;
   if(sum==6)
   co<=1;
end

这种情况不利于阅读,虽然语法上是成立的。就像C里面的GOTO一样
BTW:对同一个变量在同一个时钟沿赋值不属于阻塞非阻塞的范畴。
此帖出自FPGA/CPLD论坛
个人签名Net:Wxeda.taobao.com
QQ:1035868547
Blog:https://home.eeworld.com.cn/space-uid-390804.html
 
 
 

回复

581

帖子

0

TA的资源

五彩晶圆(初级)

12
 
最后说一句 Verilog是支持乘的。都集中在语法的讨论上了,
关键的忘记了。
reg [3:0]a;
reg [3:0]b;
wire [7:0]c= a*b;
这样写就OK了。
后面Espier专区会有专门的文章介绍。怎样利用FPGA中的不同资源完成乘法。
此帖出自FPGA/CPLD论坛

点评

非常感谢你,很多都是基础的,我也正在学习中。就是这个out为什么一开始就是高电平,理论上将默认应该是低电平啊,不理解 module cntt7(clk,rst,out); input clk,rst; output out; reg out; reg[2:0]temp;  详情 回复 发表于 2013-7-17 18:51
个人签名Net:Wxeda.taobao.com
QQ:1035868547
Blog:https://home.eeworld.com.cn/space-uid-390804.html
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

13
 

回复 12楼kdy 的帖子

非常感谢你,很多都是基础的,我也正在学习中。就是这个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
此帖出自FPGA/CPLD论坛
 
 
 

回复

581

帖子

0

TA的资源

五彩晶圆(初级)

14
 
一开始你是指仿真吗?
还是测量。
仿真如果没有赋值应该是个红色线,表示X。
然后完成复位,7个周期后变高之后就一直高了
此帖出自FPGA/CPLD论坛

点评

另外,我用EPM3128ATI-10N 这个芯片,仿真时出现,Error: Can\'t fit 135 registers in device,是说我寄存器使用过多,那这个芯片本身的registers是128吗,上面写128是Macrocell ,怎么看呢?谢谢  详情 回复 发表于 2013-7-18 10:35
是这样子的,这个程序在functional 仿真下一开始是低电平,7个周期后一直保持高电平 在Timing 仿真模式下从一开始就是高电平。 我不理解,那到底应该相信哪个,按理说后仿真应该就考虑了信号延时,但怎么结果差这  详情 回复 发表于 2013-7-18 09:50
个人签名Net:Wxeda.taobao.com
QQ:1035868547
Blog:https://home.eeworld.com.cn/space-uid-390804.html
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

15
 

回复 14楼kdy 的帖子

是这样子的,这个程序在functional 仿真下一开始是低电平,7个周期后一直保持高电平
在Timing 仿真模式下从一开始就是高电平。
我不理解,那到底应该相信哪个,按理说后仿真应该就考虑了信号延时,但怎么结果差这么多
此帖出自FPGA/CPLD论坛
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

16
 

回复 14楼kdy 的帖子

另外,我用EPM3128ATI-10N 这个芯片,仿真时出现,Error: Can't fit 135 registers in device,是说我寄存器使用过多,那这个芯片本身的registers是128吗,上面写128是Macrocell ,怎么看呢?谢谢
此帖出自FPGA/CPLD论坛
 
 
 

回复

581

帖子

0

TA的资源

五彩晶圆(初级)

17
 
1、前后仿真不应该影响结果,但由于你的是输出信号,所以你行为级仿真没看到X信号有点奇怪,起始总有X的。
你的仿真软件不是Modelsim吧,其余的不是那么好观察。
2、是不够了,128个Macrocell里每个包含1个寄存器
这个片子都老掉牙了
此帖出自FPGA/CPLD论坛

点评

恩恩,就是quartus自带的仿真,谢谢了! 寄存器溢出,是因为这个逻辑占的寄存器太多,能减少一点吗,这是逻辑是一路,我需要用5路,还有其他的逻辑等等。现在正在想办法把这个改善一下,不知道你有没有印象了,这个  详情 回复 发表于 2013-7-18 17:43
个人签名Net:Wxeda.taobao.com
QQ:1035868547
Blog:https://home.eeworld.com.cn/space-uid-390804.html
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

18
 

回复 17楼kdy 的帖子

恩恩,就是quartus自带的仿真,谢谢了!
寄存器溢出,是因为这个逻辑占的寄存器太多,能减少一点吗,这是逻辑是一路,我需要用5路,还有其他的逻辑等等。现在正在想办法把这个改善一下,不知道你有没有印象了,这个程序是你写的,后来我改了下。
module allen(clk30m,pwm,out);
input clk30m,pwm;
output out;
reg [10:0]cnt_pulse;

always @(posedge clk30m or negedge pwm)
begin
        if(!pwm)
                cnt_pulse = 0;
        else if (cnt_pulse[10]==1)
                cnt_pulse = cnt_pulse;
        else
                cnt_pulse = cnt_pulse + 1;
end
wire pwm_ok = !(cnt_pulse[10]==1);
reg [9:0]cnt_095;
always @(posedge clk30m or posedge pwm_ok)
begin
        if(pwm_ok)                              
                cnt_095 = 0;
        else
              cnt_095= cnt_095 + 1;            
end
wire pwm_095 = !(cnt_095>=955 && cnt_095<=1023);

assign out = pwm_ok ? pwm : pwm_095 ;
endmodule
此帖出自FPGA/CPLD论坛
 
 
 

回复

581

帖子

0

TA的资源

五彩晶圆(初级)

19
 
5路的话wire pwm_095 = !(cnt_095>=955 && cnt_095<=1023);
1、都是10位的比较器太大。
2、节约资源就对30M分频,再重新算一下计数器的位数。就减少了很多reg
此帖出自FPGA/CPLD论坛

点评

恩恩,谢谢!我 二分频处理过了,可以实现,现在用125个寄存器,这样几乎要饱和了,对芯片好不好,一般情况下要有20%的裕量吧?  详情 回复 发表于 2013-7-18 19:51
个人签名Net:Wxeda.taobao.com
QQ:1035868547
Blog:https://home.eeworld.com.cn/space-uid-390804.html
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

20
 

回复 19楼kdy 的帖子

恩恩,谢谢!我 二分频处理过了,可以实现,现在用125个寄存器,这样几乎要饱和了,对芯片好不好,一般情况下要有20%的裕量吧?
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表