2013-03-22 103 views
0

我想根据设计编写乘数。它由两个16位输入组成,单个加法器用于计算部分乘积。一个输入的LSB与另一个输入的16位进行AND操作,AND门的输出重复地加到前一个输出。它的Verilog代码如下,但我似乎无法使输出正常工作。Verilog中的逻辑问题

module datapath(output reg [31:15]p_high, 
       output reg [14:0]p_low, 
       input [15:0]x, y, 
       input clk); // reset, start, x_ce, y_ce, y_load_en, p_reset, 
       //output done); 

reg [15:0]q0; 
reg [15:0]q1; 
reg [15:0]and_output; 
reg [16:0]sum, prev_sum; 
reg d_in; 
reg [3:0] count_er; 

initial 
begin 
     count_er <= 0; 
     sum <= 17'b0; 
     prev_sum <= 17'b0; 
end 

[email protected](posedge clk) 
begin 
     q0 <= y; 
     q1 <= x; 
     and_output <= q0[count_er] & q1; 
     sum <= and_output + prev_sum;  
     prev_sum <= sum; 
     p_high <= sum; 
     d_in <= p_high[15]; 
     p_low[14] <= d_in; 
     p_low <= p_low >> 1; 
     count_er <= count_er + 1; 
end 
endmodule 

enter image description here 我创建了一个测试平台,测试电路和我看到的第一个问题是,我希望它与操作不起作用。 x操作数的16位与y操作数的LSB进行和操作。 y操作数在每个时钟周期后移位一位,并通过连续添加部分乘积来计算最终产品。

但是,我从sum和prev_sum行开始出现问题,它们的输出显示为xxxxxxxxxxxx。

+1

* “具有获取输出工作的烦恼” *。你可以请更具体吗?如果我们首先了解发生了什么问题,那么更容易进行调试。 – Tim 2013-03-22 23:47:08

+0

我添加了更多内容。 – GamingX 2013-03-23 01:17:35

回答

1

你似乎没有被正确重置,你需要的所有信号,或者你似乎混淆了非阻塞任务的工作方式。

后初始开始:

  • sum是0
  • prev_sum是0
  • and_output被X

第一上升沿之后:

  • sum是X,因为and_output是X和X + 0返回X.此时总和保持X永远,因为X +的东西始终是X.

你正在创建一个寄存器,在几乎每一个信号的设计,这意味着你的信号没有立即更新。你需要区分你想注册的信号和只是组合术语的信号。用posedge clock上的非阻塞语句更新寄存器,并通过将组合条件置于always @*块中立即更新组合条件。

我不知道你正在尝试使用的算法,所以我不能说哪一行应该是哪一行,但我真的怀疑你打算让x/y花费一个时钟周期传播到q0/q1q的另一个周期传播到and_output,又一个时钟周期传播从and_output总结。


评论上更新的代码:

  • 合流块应该使用阻塞赋值,非阻塞不分配。在always @ *块内使用=而不是<=
  • sum <= and_output + sum;看起来不对,应该是sum = and_output + p_high[31:16]根据你的图片。
  • 您在此处分配两次p_low [14]。让第二条语句明确设定位[13:0]只:

    p_low[14] <= d_in; 
    p_low[13:0] <= p_low >> 1; 
    
+0

我已经更新了代码,但不知道评论是否能够保存修改后的代码。我还粘贴了我试图实现的电路链接。更新的代码:http://pastebin.com/NSaayfHG,设计:https://dl.dropbox.com/u/793037/2013-03-22_2236.png – GamingX 2013-03-23 03:39:03

+0

@GamingX - 我编辑了一些关于你的新代码的额外评论希望这会让你开始。如果您仍然有问题,请尝试跟踪模拟器中的信号以查看问题所在。 – Tim 2013-03-23 04:00:20

+0

我不认为您所做的更改已保存。一旦你做出改变,它可能会创建一个新的链接。 – GamingX 2013-03-23 04:13:48

0

你是混合在同一顺序always块,这可能会导致意想不到的结果阻塞和非阻塞赋值:

d_in <= p_high[15]; 
p_low[14] = d_in; 
+0

我修改了它,但没有正面结果,但感谢您指出。 – GamingX 2013-03-23 01:18:15