在一些在线verilog编译器(我正在学习Verilog)中,我正在尝试编写一个带有状态变量的模块。当给模块一个工作ID和两个非零的数字时,结果将被写入另一个变量。
当我从
更改功能时c=a**b
到
c=(a**b+a**(b+1)+(a+1)**b)/10;
它在相同数量的时钟周期后给出结果。这两个函数如何在相同的时钟周期内完成?
http://www.tutorialspoint.com/compile_verilog_online.php
module pow;
parameter rdy=0,bsy=1;
reg [63:0] a;
reg [63:0] b;
reg [63:0] c;
reg [63:0] work_id_input;
reg [63:0] work_id_output;
reg [3:0] state;
initial
begin
state=rdy;
work_id_input=0;
work_id_output=0;
a=0;
b=0;
c=0;
end
always
#1 begin
if(state==rdy && a>0 && b>0 && work_id_input!=work_id_output)
begin
state=bsy;
end
end
always
#1 begin
if(state==bsy && work_id_input==work_id_output)
begin
state=rdy;
end
end
always
#1 begin
if(state==bsy)
begin
c=(a**b+a**(b+1)+(a+1)**b)/10;
a=0;
b=0;
work_id_output=work_id_input;
end
end
endmodule
module main;
reg [63:0] time_;
reg [63:0] ctr;
pow pow1();
initial
begin
ctr=0;
#100 $finish ;
end
always
#1 begin
ctr=ctr+1;
if(pow1.state==pow1.rdy && pow1.work_id_output == pow1.work_id_input)
begin
pow1.work_id_input<=ctr;
pow1.a<=ctr;
pow1.b<=3;
end
end
always
#1 begin
$display("%g counter=%d result=%d input_id=%d output_id=%d",$time,ctr, pow1.c,pow1.work_id_input,pow1.work_id_output);
end
endmodule
答案 0 :(得分:2)
Verilog HDL是一种硬件描述语言,因此构造可以变成可综合的硬件。
此处,上述两个样本都转换为组合电路。通过直觉,我们可以看到c=a**b
将具有比c=(a**b+a**(b+1)+(a+1)**b)/10
更少的硬件。但这里的要点是涉及 no 顺序逻辑。
组合电路没有时钟依赖性,理想情况下,您应用的所有输入都可以在零<强>模拟时间内瞬时转换为输出。因此,模拟器同时提供结果。
但是,在真实硬件中,由于有限的设置&amp;保持时间和其他门延迟,需要一些时间将应用的输入转换为输出。这里,第二个样本可能需要更多硬件,因此与第一个样本相比,它可以处理低频输入。在这方面,它们的操作频率不同。
在这里,这与ctr
的值无关,但它与{{1>的更改率有很大关系实际电路可以处理。
所有这些在这里产生差异的是你综合代码之后(或者你在这里手动添加一些门延迟)。有关综合的更多信息,this本书可能会有所帮助。