verilog 输出停留在最后一个 if 语句上
verilog output stuck on last if statement
问题:我正在综合我的代码,它读取 1200 个 16 位二进制向量,分析它们并根据 4 个 if 语句的行为设置一个名为 classe 的 2 位寄存器。问题似乎是 classe 卡在最后一个 if 语句上 - 其中 classe 设置为位 11 或 3。
我的代码在使用测试台时运行良好。
我认为它卡住了,因为 always 块以某种方式一次读取所有 1200 个向量,如在模拟中所见,而不是每个时钟边沿读取一个向量?
我在这里附上了一张模拟截图:https://imgur.com/a/No2E9cq
module final_final_code
(
output reg [ 0:1] classe
);
reg [0:15] memory [0:1199];
reg[0:15] vect:
integer i;
//// Internal Oscillator
defparam OSCH_inst.NOM_FREQ = "2.08";
OSCH OSCH_inst
(
.STDBY(1'b0), // 0=Enabled, 1=Disabled also Disabled with Bandgap=OFF
.OSC(osc_clk),
.SEDSTDBY() // this signal is not required if not using SED
);
initial begin
$readmemb("C:/Users/KP/Desktop/data.txt", memory, 0, 1199);
i = 0;
end
always @(posedge osc_clk) begin
vect = memory[i];
if ((memory[i][3] == 1'b0)) begin
classe = 2'b10;
end
if ((memory[i][11] == 1'b0)) begin
classe = 2'b01;
end
if ((memory[i][8] == 1'b1 && memory[i][4] + memory[i][5] + memory[i][6] + memory[i][7] >= 4'b0100)) begin
classe = 2'b00;
end
if ((memory[i][0] + memory[i][1] + memory[i][2] + memory[i][3] + memory[i][4] + memory[i][5] + memory[i][6] + memory[i][7] + memory[i][8] + memory[i][9] + memory[i][10] + memory[i][11] + memory[i][12] + memory[i][13] + memory[i][14] + memory[i][15] <= 1'b1)) begin
classe = 2'b11;
end
i = i + 1'd1;
if (i == 4'd1199) begin
i = 0;
end
end
endmodule
除了 john_log 所说的:
你的最后一个 if 语句总是 TRUE。您正在添加 1 位操作数并与 1 位结果进行比较,因此结果为 1'b1 或 1'b0,它始终 <= 1'b1.
你应该检查你的FPGA工具是否支持这个:
initial begin
$readmemb("C:/Users/KP/Desktop/data.txt", memory, 0, 1199);
i = 0;
end
尤其是综合工具从文件中加载内存。上次用FPGA是不可能的。
问题:我正在综合我的代码,它读取 1200 个 16 位二进制向量,分析它们并根据 4 个 if 语句的行为设置一个名为 classe 的 2 位寄存器。问题似乎是 classe 卡在最后一个 if 语句上 - 其中 classe 设置为位 11 或 3。
我的代码在使用测试台时运行良好。
我认为它卡住了,因为 always 块以某种方式一次读取所有 1200 个向量,如在模拟中所见,而不是每个时钟边沿读取一个向量?
我在这里附上了一张模拟截图:https://imgur.com/a/No2E9cq
module final_final_code
(
output reg [ 0:1] classe
);
reg [0:15] memory [0:1199];
reg[0:15] vect:
integer i;
//// Internal Oscillator
defparam OSCH_inst.NOM_FREQ = "2.08";
OSCH OSCH_inst
(
.STDBY(1'b0), // 0=Enabled, 1=Disabled also Disabled with Bandgap=OFF
.OSC(osc_clk),
.SEDSTDBY() // this signal is not required if not using SED
);
initial begin
$readmemb("C:/Users/KP/Desktop/data.txt", memory, 0, 1199);
i = 0;
end
always @(posedge osc_clk) begin
vect = memory[i];
if ((memory[i][3] == 1'b0)) begin
classe = 2'b10;
end
if ((memory[i][11] == 1'b0)) begin
classe = 2'b01;
end
if ((memory[i][8] == 1'b1 && memory[i][4] + memory[i][5] + memory[i][6] + memory[i][7] >= 4'b0100)) begin
classe = 2'b00;
end
if ((memory[i][0] + memory[i][1] + memory[i][2] + memory[i][3] + memory[i][4] + memory[i][5] + memory[i][6] + memory[i][7] + memory[i][8] + memory[i][9] + memory[i][10] + memory[i][11] + memory[i][12] + memory[i][13] + memory[i][14] + memory[i][15] <= 1'b1)) begin
classe = 2'b11;
end
i = i + 1'd1;
if (i == 4'd1199) begin
i = 0;
end
end
endmodule
除了 john_log 所说的:
你的最后一个 if 语句总是 TRUE。您正在添加 1 位操作数并与 1 位结果进行比较,因此结果为 1'b1 或 1'b0,它始终 <= 1'b1.
你应该检查你的FPGA工具是否支持这个:
initial begin
$readmemb("C:/Users/KP/Desktop/data.txt", memory, 0, 1199);
i = 0;
end
尤其是综合工具从文件中加载内存。上次用FPGA是不可能的。