Verilog FSM 和模块实例化
Verilog FSM and module instantiation
此有限状态机将充当数据路径的控制器,该数据路径包含计算两个 4 位数字的 GCD 所需的运算符。我对这种语言相当陌生,我知道问题可能是缺少分号或者我的声明可能有问题,但我无法弄清楚问题是什么。我不断收到错误消息:
ERROR:HDLCompiler:806 - "D:/Xilinx Stuff/GCD/GCD FSM.v" 第 44 行:"if" 附近的语法错误。
ERROR:HDLCompiler:806 - "D:/Xilinx Stuff/GCD/GCD FSM.v" 第 60 行:“=”附近的语法错误。
ERROR:HDLCompiler:806 - "D:/Xilinx Stuff/GCD/GCD FSM.v" 第 64 行:“=”附近的语法错误。
ERROR:HDLCompiler:806 - "D:/Xilinx Stuff/GCD/GCD FSM.v" 第 68 行:“;”附近的语法错误。
我也愿意接受有关一般逻辑的任何提示,FSM 的代码如下所示:
module GCD_FSM(clk,data_in,reset,data_out,x_in,y_in,gcd_out,xgty,xlty,xequaly,go_in,xnew,ynew);
input clk, data_in, reset,go_in;
input reg[3:0] x_in,y_in,gcd_out;
output reg [1:0] data_out;
reg [3:0] x,y;
output reg[3:0] xnew,ynew;
output reg xgty,xlty,xequaly,cleango;
// Declare state register
reg [1:0]state;
// Declare states
parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3, S4 =4;
/* Output depends only on the state
always @ (state) begin
case (state)
S0:
data_out = 2'b01;
S1:
data_out = 2'b10;
S2:
data_out = 2'b11;
S3:
data_out = 2'b00;
default:
data_out = 2'b00;
endcase
end
*/
// Determine the next state
always @ (posedge clk or posedge reset) begin
if (reset)
state <= S0;
else
case (state)
S0:
debounce start(.clock(clk),.noisy(go_in),.clean(cleango));
if (cleango)
state <= S1;
else
state <= S0;
S1:
state <= S2;
S2:
if (xlty)
state <= S3;
else if(xgty)
state <= S4;
else if(xequaly)
state <= S5;
S3:
ripple_carry_adder_subtractor ysubx(.S(ynew),.C(carry),.V(overflow),.A(y),.B(x),.Op(1));
y = ynew;
state <= S2;
S4:
ripple_carry_adder_subtractor xsuby(.S(xnew),.C(carry),.V(overflow),.A(x),.B(y),.Op(1));
x = xnew;
state <= S2;
S5:
gcd_out = x;
state <= S0;
endcase
end
endmodule
我注意到的一些错误:
- 第 3 行,您在末尾缺少
;
:output reg[3:0] gcd_out
- 未定义变量
go_in
和 cleango
。
- 模块去抖未定义
此有限状态机将充当数据路径的控制器,该数据路径包含计算两个 4 位数字的 GCD 所需的运算符。我对这种语言相当陌生,我知道问题可能是缺少分号或者我的声明可能有问题,但我无法弄清楚问题是什么。我不断收到错误消息:
ERROR:HDLCompiler:806 - "D:/Xilinx Stuff/GCD/GCD FSM.v" 第 44 行:"if" 附近的语法错误。 ERROR:HDLCompiler:806 - "D:/Xilinx Stuff/GCD/GCD FSM.v" 第 60 行:“=”附近的语法错误。 ERROR:HDLCompiler:806 - "D:/Xilinx Stuff/GCD/GCD FSM.v" 第 64 行:“=”附近的语法错误。 ERROR:HDLCompiler:806 - "D:/Xilinx Stuff/GCD/GCD FSM.v" 第 68 行:“;”附近的语法错误。
我也愿意接受有关一般逻辑的任何提示,FSM 的代码如下所示:
module GCD_FSM(clk,data_in,reset,data_out,x_in,y_in,gcd_out,xgty,xlty,xequaly,go_in,xnew,ynew);
input clk, data_in, reset,go_in;
input reg[3:0] x_in,y_in,gcd_out;
output reg [1:0] data_out;
reg [3:0] x,y;
output reg[3:0] xnew,ynew;
output reg xgty,xlty,xequaly,cleango;
// Declare state register
reg [1:0]state;
// Declare states
parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3, S4 =4;
/* Output depends only on the state
always @ (state) begin
case (state)
S0:
data_out = 2'b01;
S1:
data_out = 2'b10;
S2:
data_out = 2'b11;
S3:
data_out = 2'b00;
default:
data_out = 2'b00;
endcase
end
*/
// Determine the next state
always @ (posedge clk or posedge reset) begin
if (reset)
state <= S0;
else
case (state)
S0:
debounce start(.clock(clk),.noisy(go_in),.clean(cleango));
if (cleango)
state <= S1;
else
state <= S0;
S1:
state <= S2;
S2:
if (xlty)
state <= S3;
else if(xgty)
state <= S4;
else if(xequaly)
state <= S5;
S3:
ripple_carry_adder_subtractor ysubx(.S(ynew),.C(carry),.V(overflow),.A(y),.B(x),.Op(1));
y = ynew;
state <= S2;
S4:
ripple_carry_adder_subtractor xsuby(.S(xnew),.C(carry),.V(overflow),.A(x),.B(y),.Op(1));
x = xnew;
state <= S2;
S5:
gcd_out = x;
state <= S0;
endcase
end
endmodule
我注意到的一些错误:
- 第 3 行,您在末尾缺少
;
:output reg[3:0] gcd_out
- 未定义变量
go_in
和cleango
。 - 模块去抖未定义