【发布时间】:2019-03-20 03:20:44
【问题描述】:
我编写了以下模块来接收 12 位输入流,并通过 Exponential Moving Average (EMA) 公式运行它。在模拟程序时,我的输出似乎是一个 12 位的“不关心”流。不管我的输入是什么,它都不是由输出寄存器实现的。
我是 Verilog 的初学者,所以我确信这里有很多问题,但我希望至少能得到某种输出。为什么会发生这种行为,我该如何解决它,以免将来发生?我在这篇文章的底部链接了我的波形结果的屏幕截图。
我的verilog模块:
`timescale 1ns / 1ps
module EMATesting ( input signed [11:0] signal_in,
output reg signed [11:0] signal_out,
input clock_in,
input reset,
input enable,
output reg [11:0] newEMA);
reg [11:0] prevEMA;
reg [11:0] y;
reg [11:0] temp;
integer count = 0;
integer t = 1;
integer one = 1;
integer alpha = 0.5;
always @(posedge clock_in) begin
if (reset) begin
count = 0;
end
else if (count < 64) begin
count = count + 1;
end
//set the output equal to the first value received
if (count == 1) begin
newEMA = signal_in;
end
//if not the first value, run through the formula
else begin
temp = newEMA;
prevEMA = temp;
newEMA = alpha * signal_in + (one-alpha) * prevEMA;
count = count + 1;
end
end
endmodule
我的 verilog 测试平台:
`timescale 10ns / 1ns
module testbench_EMA;
reg signal_in;
reg clock_in, reset, enable;
wire [11:0] signal_out;
wire [11:0] newEMA;
initial begin
signal_in = 0; reset = 0; enable = 0;
clock_in = 0;
end
EMATesting DUT(signal_in, signal_out, clock_in, reset, enable, newEMA);
initial
begin
//test some values with timing intervals here
#100;
reset = 1;
#100;
reset = 0;
enable = 1;
#100;
//set signal_in to "1" repeating 12 times
signal_in = { 12 { 1'b1}};
#100;
reset = 1;
#100; //buffer to end simulation
$finish;
end
always
#5 clock_in = !clock_in;
endmodule
Waveform results of my testbench。请注意,两个输出寄存器都没有给出任何值。
【问题讨论】:
-
您可能应该将此问题移至电气工程堆栈交换,在那里您可能会有更好的运气。我自己不是 Verilog 用户(取而代之的是 VHDL),但我可以指出三个基本问题:1)您永远不会在任何地方为
signal_out赋值,这样就可以解释 X 在那里,2)您应该始终重置您的所有reset块中的输出,以及 3) 您将alpha设置为 0.5,但您已将其声明为integer,因此这显然不起作用。似乎也存在一些 Verilog 分配问题,但您仍然需要实际的 Verilog 用户来指出这些问题。 -
我同意@Mr.鼻涕虫。此外,永远不要在 always@(posedge clock_in) 块中使用 '=' - 阻塞分配。