2016-12-04 42 views
-3

Block diagram我已经写Verilog代码基于FSM串行加法电路,但是m到处某种语法错误的

设计是一个串行加法器。当上输入设置为1时,它需要8位输入A和B并以串行方式将它们相加。操作结果存储在9位总和寄存器中,并附有框图。我正在使用Quartus II 13.0sp1(64位)网络版。

错误: 错误(10170):在LAB9b.v(56)附近的文本“â”处出现Verilog HDL语法错误;期待“:”或“,” 我还没有在代码中的任何地方写过这个文本,但它仍然在播放“?”附近的语法错误。

以下是编写的代码: -

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 
[email protected](*) 
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 
[email protected](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; 

[email protected](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 
+1

“请别人让它工作”并不是寻求帮助的非常有吸引力的方式。此外,你没有说出你遇到了什么样的错误。请尝试隔离问题并在你的问题中强调这一点。你也可以花3分钟时间阅读这个来缩小你的问题,并在这里发布 - [最小,完整和可验证示例](http://stackoverflow.com/help/mcve) – Tom

+0

所以我们不必倒数56行,对第56行发表评论 –

回答

0

'(注意形状差异)。 Verilog使用撇号字符(',ASCII 0x27)。您的可能是一个扩展的ASCII字符。还有一个»字符,我相信应该是!

我猜你是在word编辑器(例如Microsoft Word,LibreOffice Writer,Apple iWork等)中编写代码的。这些类型的编辑倾向于将'换成,因为它对人类更具视觉吸引力。电子邮件客户端和一些消息应用程序也倾向于这样做。

你应该总是将你的代码写在一个简单的文本编辑器或编写代码的编辑器中。 Emacs和Vim是编写代码的流行编辑器;语法高亮插件可用于两者。像Eclipse这样的IDE是另一种选择。记事本也起作用。


我也注意到您使用和tempregassign声明。这在Verilog中不合法。 assign陈述只能在净类型上完成(例如wire)。修复»后可能会出现其他编译错误,但错误消息可能会更有帮助。
编译器不会标记它,但建议编码风格是在组合块([email protected](*))内使用阻塞赋值(=),而不是非阻塞(<=)。