Verilog 计算平方根
我编写代码来计算数字的完美平方,但没有得到正确的输出。我接受输入Verilog 计算平方根,verilog,computer-architecture,system-verilog,Verilog,Computer Architecture,System Verilog,我编写代码来计算数字的完美平方,但没有得到正确的输出。我接受输入b和regsa,d。首先,我将1放在d中,然后将其平方并存储在a中。然后与输入进行比较-如果不满足,则增加d。但我得到的输出是square=XXXX 我的代码: module square_root(b,clk,square); input [3:0] b; input clk; output [3:0]square; reg[3:0]a,square; reg[2:0] d; initial begin d<
b
和regsa
,d
。首先,我将1
放在d
中,然后将其平方并存储在a
中。然后与输入进行比较-如果不满足,则增加d
。但我得到的输出是square=XXXX
我的代码:
module square_root(b,clk,square);
input [3:0] b;
input clk;
output [3:0]square;
reg[3:0]a,square;
reg[2:0] d;
initial
begin
d<=3'b001;
end
always@(clk)
begin
a<=d*d;
if(a==b)
square<=a;
else
d<=d+1;
end
endmodule
模块平方根(b,clk,square);
输入[3:0]b;
输入时钟;
输出[3:0]平方;
reg[3:0]a,正方形;
reg[2:0]d;
最初的
开始
D
可能不是最好的代码…但是嘿改变这个
initial
begin
d<=3'b001;
end
试验台:
module TB_Sqrt;
reg clk;
reg [3:0]in;
wire [3:0]out;
Sqrt SQRT(clk,in,out);
initial
begin
clk=0;
in=9;
end
always
#2 clk=!clk;
endmodule
module TB_SQT;
reg [3:0]b;
reg clk;
wire [3:0]square;
square_root SQT(b,clk,square);
initial
begin
clk=0;
b=9;
end
always
#1 clk=!clk;
endmodule
你丢失了一个重置信号。@Tudor是的……我知道……但我刚刚指出了操作代码中的错误你丢失了一个重置信号。在现实生活中,语句reg[3:0]temp=1
没有任何意义。该赋值将被合成工具忽略。@Tudor我认为这是写入FPGA初始值的一种可接受的方式。您的ASIC正确,它将被忽略。@Morgan我不知道。不过,如果没有重置信号,你就无法真正回到初始状态(我想除了拔掉设备插头之外),因此没有重置信号的用处是相当有限的。@Tudor,我同意,我想在大多数设置中,电源循环是用来重置的。我的理解是,异步重置在fpga设备上非常昂贵(不是那么常见)。尽管可以使用同步休息。使事情复杂化的建议和用法因供应商而异。@Tudor是的,这很明显。我只是猛击了一下,以显示OP.reg[3:0]temp=1是完全正常的。您丢失了d
的重置信号。除非您使用已知值初始化触发器,否则将得到X
s。我假设a
看起来正常,那么您永远不会满足设置平方的条件a==b
。注意:如果没有完整的标志,您如何知道已计算出结果,如果正在计算平方根,您需要square
initial
begin
d=3'b001;
end
module TB_SQT;
reg [3:0]b;
reg clk;
wire [3:0]square;
square_root SQT(b,clk,square);
initial
begin
clk=0;
b=9;
end
always
#1 clk=!clk;
endmodule