Verilog描述下的初始化问题

最近在百度知道里见过两个问题,如下:

问题1:
module outer(q,c0,c1,led1,led0);
  input q;     
  output c0,c1,led1,led0;  
  reg c0,c1;    
  wire led1,led0;
  always@(q)
  begin
    c0<=~c0;
    c1<=c0^c1;
  end
  assign led0=c0;
  assign led1=c1;
endmodule
这是我的代码,为什么加波形的时候说没有q这个信号呢?仿真的时候也说输入管脚q被忽略了
问题2:

module sa(a,b,mu,shiftb,start);
input [3:0] a,b;
input start;
output reg[7:0] mu,shiftb;
integer i;

always @(a or b)
   begin 
      if(start==1)
      begin
		shiftb[3:0]=b;
		for(i=0;i<4;i=i+1)
		  if(a[i])
		  begin shiftb=shiftb<<i;mu=mu+shiftb;end
		  else 
		  begin shiftb=shiftb<<i;mu=mu+4'b0000;end
	  end
   end
endmodule
自己写的两个4位二进制数移位相乘的Verilog HDL程序 不知错在哪


看着两段代码功能不一样,但错误的本质是一样的。这里不对两段代码的编码风格做分析,也不考虑算法是否能实现预期功能,只考虑复位问题。因为两段代码的错误根本都是由于输出端口没有初始化,就直接参与了中间逻辑运算,这样一个信号x,与别的信号运算,不管是0还是1,结果还是x

以前看过一本教材,说电子系的人学verilog思维偏电路,容易忽略一些编程的细节;而学计算机的人学verilog思维偏编程,容易忽略语言对应的硬件结构。也许我之前编程稍微熟一些,所以一开始就关注到变量的初始化问题。其实在硬件电路里也是有复位的,完全可以增加一个复位信号初始化一下中间使用到的变量。或者遇到第二个例子中的情况,不要写了if不写else,描述成不必要的锁存器结构,可以利用这个else,在start信号为低电平的时候,将mu初始化为0,这样问题就解决了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值