我编写了以下模块,以接收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。请注意,两个输出寄存器都没有给出值。
答案 0 :(得分:2)
您的代码中有很多错误。 @先生。 Snrub列出了其中的一些。您可以更正注释中列出的错误,并通过进一步编辑代码来使其按需运行,但是还有更重要的基本问题。您必须先解决这些问题,然后再进行进一步的错误调试,再加上以后很难调试的错误,这还具有更好地理解HDL概念的优势。
=
或非阻塞<=
分配以及它们如何工作。检查this链接。 在研究列出的主题时,您将了解,在边缘敏感(同步或顺序)always
块中,使用阻塞=
分配是个坏主意。
使用阻塞分配时,分配是按顺序完成的,就像常见的软件编程语言一样。对于边缘敏感的always
块,您只有非常有限的时间来完成always
块内的所有必需分配。
在您的情况下,由于边缘敏感区域中的所有分配始终处于阻塞状态(假设没有重置条件):
count
是否小于64,并在这种情况下完成分配。所有其他作业都在等待该作业完成。always
的{{1}}块可能已经结束执行并等待时钟的下一个沿。因此,其他分配未完成。posedge clock_in
大于或等于64,在将值分配给count
之前,您还有其他阻塞分配。