【发布时间】:2020-04-19 05:30:20
【问题描述】:
对不起,如果这里的任何东西看起来很明显,但我开始使用这个新的 FPGA 东西,到目前为止我真的很喜欢它,但这让我发疯了。 这是一个块的 Verilog 代码,原则上应该对 8 位寄存器执行以下操作:
00000001
00000010
00000100
.....
01000000
10000000
01000000
00100000
module bit_bouncer(clock, enable, bouncer_out);
//INPUTS PORTS
input clock;
input enable;
//OUTPUTS PORTS
output bouncer_out;
//INPUT DATA TYPE
wire clock;
wire enable;
//OUTPUT DATA TYPE
reg [7:0] bouncer_out = 8'b00000001;
//Register to store data
reg direction = 0;
//CODE STARTS HERE
always @ (posedge clock) begin
if(enable) begin
bouncer_out = direction ? (bouncer_out >> 1) : (bouncer_out << 1);
direction <= (bouncer_out == 8'b00000001 || bouncer_out == 8'b10000000) ? ~direction : direction;
end
end
endmodule
这在模拟中完美运行,但在 FPGA(DE10-Nano 板,如果有兴趣)上失败。 我还应该指出,这是由通过 FPGA 上的 PLL 传递的时钟驱动的,然后 通过了 divideByN 块。 这里是 divideByN 块的代码:
module clk_divn #(
parameter WIDTH = 20,
parameter N = 1000000)
(clk,reset, clk_out);
input clk;
input reset;
output clk_out;
reg [WIDTH-1:0] pos_count = {WIDTH{1'b0}};
reg [WIDTH-1:0] neg_count = {WIDTH{1'b0}};
wire [WIDTH-1:0] r_nxt = {WIDTH{1'b0}};
always @(posedge clk)
if (reset)
pos_count <=0;
else if (pos_count ==N-1) pos_count <= 0;
else pos_count<= pos_count +1;
always @(negedge clk)
if (reset)
neg_count <=0;
else if (neg_count ==N-1) neg_count <= 0;
else neg_count<= neg_count +1;
assign clk_out = ((pos_count > (N>>1)) | (neg_count > (N>>1)));
endmodule
divideByN 也已经过模拟测试并且工作正常。 我实际上做了一个模拟,如果可以的话,divideByN 连接到“bouncer_block” 这样称呼它,它也可以工作。
一切都是模拟的,但在现实生活中没有任何效果......但不是总是这样吗:P
我希望有人能帮我解决这个问题,因为我真的很想了解更多关于 FPGA 和使用 他们在未来的项目中。
如果您阅读了所有这些内容,您会很棒,祝您有美好的一天:)
【问题讨论】:
-
您需要更详细地解释“失败”的含义。我们看不到您的 FPGA 板。
-
我连接输出的 8 个 LED 以不可预知的方式一次点亮一个(它跳得非常快并停在一个 LED 上,然后又快速跳到另一个 LED 点亮 LED在它的路径中非常短暂)
-
您使用的是我们所说的'派生时钟'。由另一个时钟加逻辑生成的时钟。昨天有一个问题here。看看那里的cmets。如果可能的话,在整个设计中使用一个主时钟。 (直到您在几年内获得多个时钟域和时钟域交叉)
-
我已经按照你说的做了,并使用了来自 FPGA 的直接时钟,我只通过了 divideByN 而不是 PLL。现在我唯一得到的是一个永远亮着的 LED,什么也没有发生(也没有按钮按下会影响它,因为你可能会认为我的逻辑与我的启用相反)。这是我的示意图,向您展示我的实际设置仍然无法正常工作(仍然使用与以前相同的代码,但我将 divideByN 调整为 50 000 000 以尝试从输入时钟获取 1Hz 信号):imgur.com/tegPQLg跨度>
-
我还编辑了 divideByN 的宽度为 26 以解释 50 000 000 的 N (不是 5 000 000 ......愚蠢的我......)。但它仍然不起作用。现在 LED 像以前一样跳来跳去,但似乎受到了 divideByN 宽度的影响,即使缓冲区对于使用的 N 来说足够大。
标签: verilog fpga modelsim quartus intel-fpga