我已经为基于FSM的串行加法器电路编写了Verilog代码,但是我得到了某种语法错误
设计是一个串行加法器。当goinput设置为1时,它接受8位输入A和B,并以串行方式将它们相加。操作结果存储在9位和寄存器中,并附上框图。我使用的是Quartus II 13.0sp1 64位Web版 错误: 错误10170:Verilog HDL语法错误,位于文本附近的LAB9b.v56;期望:,或, 我没有在代码中的任何地方写过这篇文章,但它仍然在附近散布语法错误 以下是编写的代码:-我已经为基于FSM的串行加法器电路编写了Verilog代码,但是我得到了某种语法错误,verilog,fsm,shift-register,Verilog,Fsm,Shift Register,设计是一个串行加法器。当goinput设置为1时,它接受8位输入A和B,并以串行方式将它们相加。操作结果存储在9位和寄存器中,并附上框图。我使用的是Quartus II 13.0sp1 64位Web版 错误: 错误10170:Verilog HDL语法错误,位于文本附近的LAB9b.v56;期望:,或, 我没有在代码中的任何地方写过这篇文章,但它仍然在附近散布语法错误 以下是编写的代码:- module LAB9b(A, B, start, resetn, clock, sum); in
module LAB9b(A, B, start, resetn, clock, sum);
input [7:0] A, B;
input resetn, start, clock;
output [8:0] LEDR;
// Registers
wire [7:0] A_reg,B_reg;
wire [8:0] sum;
reg [1:0] temp;
reg cin;
// Wires
wire reset, enable, load;
wire bit_sum, bit_carry;
// Confrol FSM
FSM my_control(start, clock, resetn, reset, enable, load);
// Datapath
shift_reg reg_A( clock, 1’b0, A, 1’b0, enable, load, A_reg);
shift_reg reg_B( clock, 1’b0, B, 1’b0, enable, load, B_reg);
// a full adder
assign temp [1:0] = A_reg[0] + B_reg[0] + cin;
assign bit_sum = temp [0];
assign bit_carry = temp [1];
always @(posedge clock)
begin
if (enable)
begin
if (reset)
cin <= 1’b0;
end
else
cin <= bit_carry;
end
shift_reg reg_sum( clock, reset, 9’d0, bit_sum, enable, 1’b0, sum);
defparam reg_sum.n = 9;
endmodule
module FSM(start, clock, resetn, reset, enable, load);
parameter WAIT_STATE = 2’b00, WORK_STATE = 2’b01, END_STATE = 2’b11;
input start, clock, resetn;
output reset, enable, load;
reg [1:0] current_state, next_state;
reg [3:0] counter;
// next state logic
always@(*)
begin
case(current_state)
WAIT_STATE:
if (start) next_state <= WORK_STATE;
else next_state <= WAIT_STATE;
WORK_STATE:
if (counter == 4’d8) next_state <= END_STATE;
else next_state <= WORK_STATE;
END_STATE:
if (»start) next_state <= WAIT_STATE;
else next_state <= END_STATE;
default: next_state <= 2’bxx;
endcase
end
// state registers and a counter
always@(posedge clock or negedge resetn)
begin
if (»resetn)
begin
current_state <= WAIT_STATE;
counter = ’d0;
end
else
begin
current_state <= next_state;
if (current_state == WAIT_STATE)
counter <= ’d0;
else if (current_state == WORK_STATE)
counter <= counter + 1’b1;
end
end
// Outputs
assign reset = (current_state == WAIT_STATE) & start;
assign load = (current_state == WAIT_STATE) & start;
assign enable = load | (current_state == WORK_STATE);
endmodule
//
//
module shift_reg( clock, reset, data, bit_in, enable, load, q);
parameter n = 8;
input clock, reset, bit_in, enable, load;
input [n-1:0] data;
output reg [n-1:0] q;
always@(posedge clock)
begin
if (enable)
if (reset)
q <= ’d0;
else
begin
if (load)
q <= data;
else
begin
q[n-2:0] <= q[n-1:1];
q[n-1] <= bit_in;
end
end
end
endmodule
“不是”注意形状的差异。Verilog使用撇号字符',ASCII 0x27。您的“”可能是扩展ASCII字符。还有一个»角色,我认为应该是
我猜您是在word编辑器中编写代码的,比如Microsoft word、LibreOffice Writer、Apple iWork等。这些类型的编辑器在您键入时往往会用“替换”来替换,因为它在视觉上更吸引人。电子邮件客户端和一些消息传递应用程序也倾向于这样做
您应该始终在纯文本编辑器或用于编写代码的编辑器中编写代码。Emacs和Vim是编写代码的流行编辑器;语法突出显示插件可用于这两种类型。IDE,如Eclipse,是另一种选择。记事本也能用
我还注意到您在reg type temp上使用了assign语句。这在Verilog中是不合法的,因为assign语句只能在网络类型(如wire)上执行。您可能有其他编译错误,这些错误将在修复“和”后显示,错误消息可能会更有帮助。
编译器不会标记它,但推荐的编码风格是使用blocking assignments=inside composition block always@*,而不是非blocking请有人让它工作不是一种非常吸引人的求助方式。而且,你没有说你会犯什么样的错误。请尽量孤立问题,并在问题中强调这一点。你也可以花3分钟阅读这篇文章来缩小你的问题范围,然后把它贴在这里——这样我们就不必倒56行,在第56行写评论了