Verilog 代码将模拟但不会综合。
Verilog code will simulate but won't synthesize.
这是我的有限状态机的代码
//
`timescale 1ns / 1ps
//Moore Finite State Machine Lab 3
//
// WORKING, needs Screen output
module moore(
input BTNC, //manual clk
input SW0, //clr
input SW1,
input SW2,
input SW3,
input SW4,
output reg [3:0] LED, //z
reg [2:0] y,Y
);
localparam S_00=3'b000, S_01=3'b001, S_02=3'b010,
S_03=3'b011, S_04=3'b100;
//Define next state
always @(y,SW0,SW1,SW2,SW3,SW4)
begin
case (y)
S_00: if (SW1) Y <= S_01;
else Y <= S_00;
S_01: if (SW1) Y <= S_02;
else if (SW3) Y <= S_03;
else Y <= S_01;
S_02: if (SW1) Y <= S_04;
else Y <= S_02;
S_03: if (SW2) Y <= S_04;
else if (SW3) Y <= S_02;
else Y <= S_03;
S_04: if (SW2) Y <= S_02;
else if (SW4) Y <= S_00;
else Y <= S_04;
default: Y <= 3'bxxx;
endcase
end
//Define state update
always @(SW0, BTNC)
begin
if (!SW0) y <= S_00;
else y <= Y;
end
//Define output
always @(y)
if (y==S_00)
begin
assign LED = 3'b000;
end
else if (y==S_01)
begin
assign LED = 3'b001;
end
else if (y==S_02)
begin
assign LED = 3'b010;
end
else if (y==S_03)
begin
assign LED = 3'b011;
end
else if (y==S_04)
begin
assign LED = 3'b100;
end
else
begin
assign LED = 3'b000; //not used
end
endmodule // lab3ht codename moore
当尝试在 vivado 2015.3 中进行综合时,这就是它告诉我的内容
[Common 17-69] Command failed: Vivado Synthesis failed
[Synth 8-285] failed synthesizing module 'moore' ["C:/Users/C/Desktop/moore3h/moore3/moore3.srcs/sources_1/new/moore.v":6]
[Synth 8-27] procedural assign not supported ["C:/Users/C/Desktop/moore3h/moore3/moore3.srcs/sources_1/new/moore.v":51]
[Synth 8-567] referenced signal 'Y' should be on the sensitivity list ["C:/Users/C/Desktop/moore3h/moore3/moore3.srcs/sources_1/new/moore.v":41]
我知道无法合成延迟,我尝试通过摆脱来解决这个问题
总是@(negedge BTNC) 并仅使用按钮按下,但就我对 verilog 的了解而言,这就是这些。我不知道为什么这不能被合成,所以我可以稍后生成一个比特流并将它上传到 basys3 板并在那里使用它
非常感谢任何见解,代码在模拟过程中运行得很漂亮
参考警告。您在程序块中使用了 assign
语句,使其成为 程序连续赋值 。
[Synth 8-27] procedural assign not supported
大多数工具都可以综合这些类型的赋值,但它们很容易被误用,因此尽量避免。您的工具似乎不支持此类语句。因此,删除 assign
语句并在每个if..else if..else
条件下使用简单的阻塞语句。
// Remove assign
else if (y==S_04)
assign LED = 3'b100;
//...
// use simple blocking statements
else if (y==S_04)
LED = 3'b100;
与 Y
相关的另一个警告是由于 always @(SW0, BTNC)
块的 不完整敏感列表 。您在此块中使用 else y=Y;
。今后Y
必须出现在敏感列表中。
[Synth 8-567] referenced signal 'Y' should be on the sensitivity list
对于任何组合 always
块,always@(*)
或always_comb
的使用是推荐.这将消除 提供手动灵敏度 时的任何错误。您可以在此处将所有 always
块(时钟 always
块除外)的灵敏度转换为 always@(*)
.
此外,您的下一状态逻辑 always 块是一个组合块。您必须在该块中使用 blocking(=
) 赋值。
always @(*)
begin
case (y)
S_00: if (SW1) Y = S_01; // blocking assignment
else Y = S_00; // blocking assignment
//...
参考 Procedural continuous assignment question for more information. Also, Verilog always block and Blocking vs Non-Blocking statments usage question 链接可能会有用。
这是我的有限状态机的代码
//
`timescale 1ns / 1ps
//Moore Finite State Machine Lab 3
//
// WORKING, needs Screen output
module moore(
input BTNC, //manual clk
input SW0, //clr
input SW1,
input SW2,
input SW3,
input SW4,
output reg [3:0] LED, //z
reg [2:0] y,Y
);
localparam S_00=3'b000, S_01=3'b001, S_02=3'b010,
S_03=3'b011, S_04=3'b100;
//Define next state
always @(y,SW0,SW1,SW2,SW3,SW4)
begin
case (y)
S_00: if (SW1) Y <= S_01;
else Y <= S_00;
S_01: if (SW1) Y <= S_02;
else if (SW3) Y <= S_03;
else Y <= S_01;
S_02: if (SW1) Y <= S_04;
else Y <= S_02;
S_03: if (SW2) Y <= S_04;
else if (SW3) Y <= S_02;
else Y <= S_03;
S_04: if (SW2) Y <= S_02;
else if (SW4) Y <= S_00;
else Y <= S_04;
default: Y <= 3'bxxx;
endcase
end
//Define state update
always @(SW0, BTNC)
begin
if (!SW0) y <= S_00;
else y <= Y;
end
//Define output
always @(y)
if (y==S_00)
begin
assign LED = 3'b000;
end
else if (y==S_01)
begin
assign LED = 3'b001;
end
else if (y==S_02)
begin
assign LED = 3'b010;
end
else if (y==S_03)
begin
assign LED = 3'b011;
end
else if (y==S_04)
begin
assign LED = 3'b100;
end
else
begin
assign LED = 3'b000; //not used
end
endmodule // lab3ht codename moore
当尝试在 vivado 2015.3 中进行综合时,这就是它告诉我的内容
[Common 17-69] Command failed: Vivado Synthesis failed
[Synth 8-285] failed synthesizing module 'moore' ["C:/Users/C/Desktop/moore3h/moore3/moore3.srcs/sources_1/new/moore.v":6]
[Synth 8-27] procedural assign not supported ["C:/Users/C/Desktop/moore3h/moore3/moore3.srcs/sources_1/new/moore.v":51]
[Synth 8-567] referenced signal 'Y' should be on the sensitivity list ["C:/Users/C/Desktop/moore3h/moore3/moore3.srcs/sources_1/new/moore.v":41]
我知道无法合成延迟,我尝试通过摆脱来解决这个问题 总是@(negedge BTNC) 并仅使用按钮按下,但就我对 verilog 的了解而言,这就是这些。我不知道为什么这不能被合成,所以我可以稍后生成一个比特流并将它上传到 basys3 板并在那里使用它 非常感谢任何见解,代码在模拟过程中运行得很漂亮
参考警告。您在程序块中使用了 assign
语句,使其成为 程序连续赋值 。
[Synth 8-27] procedural assign not supported
大多数工具都可以综合这些类型的赋值,但它们很容易被误用,因此尽量避免。您的工具似乎不支持此类语句。因此,删除 assign
语句并在每个if..else if..else
条件下使用简单的阻塞语句。
// Remove assign
else if (y==S_04)
assign LED = 3'b100;
//...
// use simple blocking statements
else if (y==S_04)
LED = 3'b100;
与 Y
相关的另一个警告是由于 always @(SW0, BTNC)
块的 不完整敏感列表 。您在此块中使用 else y=Y;
。今后Y
必须出现在敏感列表中。
[Synth 8-567] referenced signal 'Y' should be on the sensitivity list
对于任何组合 always
块,always@(*)
或always_comb
的使用是推荐.这将消除 提供手动灵敏度 时的任何错误。您可以在此处将所有 always
块(时钟 always
块除外)的灵敏度转换为 always@(*)
.
此外,您的下一状态逻辑 always 块是一个组合块。您必须在该块中使用 blocking(=
) 赋值。
always @(*)
begin
case (y)
S_00: if (SW1) Y = S_01; // blocking assignment
else Y = S_00; // blocking assignment
//...
参考 Procedural continuous assignment question for more information. Also, Verilog always block and Blocking vs Non-Blocking statments usage question 链接可能会有用。