FPGA(Verilog) - 在模拟中工作,但不从事FPGA工作



以下代码实现(或应实现)一个7段驱动程序,该驱动程序从某些开关中读取值,并在4 7个段显示中显示该值。模拟工作正常,但是当它在FPGA中运行时,7个段显示显示了一些时间的时间,然后没有片段点亮。我不知道为什么它不起作用。另外,我实施了一个简单的计数器。当我在始终块内部有"< ="时,它可以正常工作,而当我有" ="时,它没有,但是在模拟中,它两者都可以使用。"< ="one_answers" ="仅仅是"< ="之间的区别,并以序列和" =" ="?

"

我还应该说,如果不是从交换机将值发送到显示模块我发送恒定值。

display.v:

module display(
    input [15:0] count,
    output reg [6:0] seg,
    output dp,
    output [3:0] an,
    input clk
    );
reg [3:0] an_temp;
reg [6:0] rom [9:0];
initial
begin
    an_temp <= 1;
    rom[0] <= 'b1000000;
    rom[1] <= 'b1111001;
    rom[2] <= 'b0100100;
    rom[3] <= 'b0110000;
    rom[4] <= 'b0011001;
    rom[5] <= 'b0010010;
    rom[6] <= 'b0000010;
    rom[7] <= 'b1111000;
    rom[8] <= 'b0000000;
    rom[9] <= 'b0110000;
end
assign dp = 1;
assign an = ~an_temp;
wire [3:0] disp [3:0];
assign disp[0] = count % 10;
assign disp[1] = ((count - disp[0])/10) % 10;
assign disp[2] = ((count - disp[1]*10 - disp[0])/100) % 10;
assign disp[3] = ((count - disp[2]*100 - disp[1]*10 - disp[0])/1000) % 10;
always @ (posedge clk)
begin
    if (an_temp == 'b1000) an_temp = 1;
    else an_temp = an_temp = 1;
    case (an_temp)
        'b0001: seg <= rom[disp[0]];
        'b0010: seg <= rom[disp[1]];
        'b0100: seg <= rom[disp[2]];
        'b1000: seg <= rom[disp[3]];
        default: seg <= 'b1111111;
    endcase
end
endmodule

disp_clk.v:

module disp_clk(
    input clk,
    output disp_clk
    );
reg [31:0] count;
initial count = 0;
always @ (posedge clk)
begin
    count = count + 1;
    if (count == 400000) count = 0;
end
assign disp_clk = (count > 200000) ? 1 : 0;
endmodule

top.v:

module top(
    input clk,
    input [15:0] sw,
    output [6:0] seg,
    output dp,
    output [3:0] an
    );
wire disp_clk;
disp_clk disp_clk0(
    .clk(clk),
    .disp_clk(disp_clk)
    );
display disp0(
    .count(sw),
    .seg(seg),
    .dp(dp),
    .an(an),
    .clk(disp_clk)
    );
endmodule

谢谢

我还应该说,如果而不是从中发送值 开关到显示模块我发送一个恒定值。

听起来您没有达到计时窗口。如果计数是恒定向量,则disp分配都应在合成中预先计算。否则,需要即时计算它们,并推断必要的逻辑(相当慢)。

((count - disp[2]*100 - disp[1]*10 - disp[0])/1000) % 10具有乘数进料到另一个部门的划分。人们希望这被推断为级联DSP,但是您应该检查资源报告以确保,并且作为添加的理智检查,请确保Constant vs Switched信号的资源计数显示出区别。

如果您不能想到更最佳的逻辑,则可能需要管道这些操作。

"&lt; ="one_answers" ="仅仅是"&lt; ="之间的区别在序列中和" ="

是的,从某种意义上说。<==分别参考非阻止分别分配

模拟器将在每个时间步骤中计算逻辑分配。

对于非阻滞,计算右侧侧,如果在逻辑上取决于其他信号,则可以在时间步长以后更新,然后在下一个时间步骤开始之前,左所有非阻滞作业的手部均分配给更新的右侧。

在A 阻止分配中,模拟器将评估右侧并立即将其分配到左侧,以这种方式,其他逻辑是 blocked 分配。

您可以考虑此顺序,但请记住,顺序仅在的功能块中是true 。如果您总是有两个块在同一时间步骤执行共同依赖性评估的情况下,则不能保证您将首先评估模拟器,并且您可能会根据模拟器的调度方式看到一些奇异的行为。

>

最佳实践是使用打算是组合的行为(即always@(*)),而对旨在顺序的人进行非阻滞作业(即always@(posedge Clock))。

最新更新