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-27 11:12
一开始你是指仿真吗?
还是测量。
仿真如果没有赋值应该是个红 {MOD}线,表示X。
然后完成复位,7个周期后变高之后就一直高了
allenwang6392
2楼-- · 2019-03-27 17:01
是这样子的,这个程序在functional 仿真下一开始是低电平,7个周期后一直保持高电平
在Timing 仿真模式下从一开始就是高电平。
我不理解,那到底应该相信哪个,按理说后仿真应该就考虑了信号延时,但怎么结果差这么多
allenwang6392
3楼-- · 2019-03-27 21:55
 精彩回答 2  元偷偷看……
kdy
4楼-- · 2019-03-27 22:39
1、前后仿真不应该影响结果,但由于你的是输出信号,所以你行为级仿真没看到X信号有点奇怪,起始总有X的。
你的仿真软件不是Modelsim吧,其余的不是那么好观察。
2、是不够了,128个Macrocell里每个包含1个寄存器
这个片子都老掉牙了
allenwang6392
5楼-- · 2019-03-28 01:37
恩恩,就是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
kdy
6楼-- · 2019-03-28 03:56
5路的话wire pwm_095 = !(cnt_095>=955 && cnt_095<=1023);
1、都是10位的比较器太大。
2、节约资源就对30M分频,再重新算一下计数器的位数。就减少了很多reg

一周热门 更多>