我正在学习verilog,尝试制作" hello world"在ice40LX1K板(olimex ice40HX1K + VGA I / O板)上的VGA世界(弹跳球)。
我有一个奇怪的问题:当我使用iverilog + GTKWave模拟我的设计时,接缝效果很好。但是硬件实现不起作用。
奇怪的是,在硬件实现中,球不会移动..并且它的位置全为零(0,0),而verilog代码永远不应该将其设置为超出。 看起来更改xpos_ball或ypos_ball的值实际上并不会更改这些值。 (硬件问题?yosys问题)?在iverilog模拟中,球的位置确实会发生变化。
我不知道这是否是我自己的verilog代码中的错误(因为我是新的,这很可能),yosys中的问题,或硬件中的问题(速度问题,是100) Mhz时钟要快?)或其他什么?
有关如何解决此问题或此类问题的后续步骤的任何提案?我可以使用其他调试技巧吗?
(编辑:链接到已删除的实际verilog代码不再相关)
克里斯托夫
答案 0 :(得分:0)
是100 Mhz的快速时钟吗?
是。该设计适用于39.67 MHz:
$ make vga_bounceball.rpt
icetime -d hx1k -mtr vga_bounceball.rpt vga_bounceball.asc
// Reading input .asc file..
// Reading 1k chipdb file..
// Creating timing netlist..
// Timing estimate: 25.21 ns (39.67 MHz)
编辑评论:
使用FF作为时钟分频器,您始终可以安全地将时钟除以2的幂:
input clk_100MHz;
reg clk_50MHz = 0; // initialization needed for simulation
reg clk_25MHz = 0;
always @(posedge clk_100MHz) clk_50MHz <= !clk_50MHz;
always @(posedge clk_50MHz) clk_25MHz <= !clk_25MHz;
(如果不通过时序分析确定预分频器本身可以在高频域运行,那么非二次幂预分频器并不总是安全的。)