永发信息网

自己写的两个4位二进制数移位相乘的Verilog HDL程序 不知错在哪…新人求指导

答案:2  悬赏:0  手机版
解决时间 2021-03-20 16:54
  • 提问者网友:niaiwoma
  • 2021-03-20 09:41
自己写的两个4位二进制数移位相乘的Verilog HDL程序 不知错在哪…新人求指导
最佳答案
  • 五星知识达人网友:鱼忧
  • 2021-03-20 11:00
第一个问题:
shiftb不是输出不应该定义为output
可以直接定义reg [7:0]shiftb
第二个问题:
if(a[i])
begin shiftb=shiftb< else
begin shiftb=shiftb<这个地方要先加,后左移,如果先左移了,就跟你目前的a[i]对不上了,左移之后对应的是a[i+1](可能不应该这么写,意思是i+1位于结果相加)。
可以改成
if(a[i])
begin mu=mu+shiftb;shiftb=shiftb< else
begin shiftb=shiftb<第三个问题:
shiftb[3:0]=b;这个我不知道该不该这么写,不过如果把[3:0]去掉,肯定是对的。系统会默认把b赋值给shiftb的低四位。追问555…照你的说法改动之后输出mu是一串X啊…
Warning: Latch mu[0]$latch has unsafe behavior
……
Warning: Latch mu[7]$latch has unsafe behavior
是什么意思?是说输出mu不安全么?追答module sa(a,b,mu,shiftb,start);
input [3:0] a,b;
input start;
output reg[7:0] mu;
reg [7:0]shiftb;
integer i;

always @(a or b)
begin
if(start)
begin
shiftb<=b;
for(i=0;i<4;i=i+1)
if(a[i])
begin mu<=mu+shiftb;shiftb<=shiftb< else
begin shiftb<=shiftb< end
end
endmodule
你再试试看可以不。这个我试了下,可以综合的。
全部回答
  • 1楼网友:举杯邀酒敬孤独
  • 2021-03-20 11:32
个人认为,shiftb作为输出没有什么问题,中间变量都可以作输出,这样便于调试。一楼最后给的代码是不能综合的,因为你在模块声明里:module sa(a,b,mu,shiftb,start);
但是你的端口声明里没有shiftb信号,所以综合肯定过不了。
而问题的关键在于,你的mu不初始化么?假如这个程序跑起来,第一次执行,那么a[i]假如是1,那么你的这一步mu=mu+shiftb,mu本来就是x, 可是x+b还是x,所以你的mu会一直是x.建议你对你的mu初始化一下,或者有个复位信号,start为低电平时mu为8'b0,加一个else就OK了。
最后注意你的敏感信号列表,always @(*)
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯