Lattice Diamond:设置时钟

时间:2012-07-02 16:44:13

标签: warnings delay verilog led lattice-diamond

我正在努力学习Verilog并与CPLD合作,我被困住了。我写的代码切换了LED,但在合成过程中我一直收到警告。

//toggles LED on and off after 1000000 clock cycles

module LEDON(
LED,
clk
);

output LED;
reg LED;

input clk ;
wire clk;

reg [31:0] count;
wire count_max = 32'd1_000_000;

assign count_nxt = (count >= count_max) ? 32'd0 : count + 32'd1;
assign led_state_nxt = (count == count_max) ? ~LED : LED;

always @(posedge clk)

begin
    count <= count_nxt;
    LED <= led_state_nxt;

end

endmodule

我收到了这些警告:

  

@W:MT420 |找到推断时钟LEDON | clk,周期为1000.00ns。请在对象“p:clk”上声明用户定义的时钟   警告 - 地图:C:/ Documents and Settings / belo / Desktop / LedOn2 / LedON2.lpf(4):FREQUENCY NET“clk”2.080000 MHz出错;
  警告 - map:首选项解析结果:检测到1个语义错误   警告 - 地图:首选项文件中有错误“C:/ Documents and Settings / belo / Desktop / LedOn2 / LedON2.lpf”。
  警告 - map:首选项文件中存在语义错误,“C:/ Documents and Settings / belo / Desktop / LedOn2 / LedON2.prf”。

我的LPF文件如下所示:

BLOCK RESETPATHS ;
BLOCK ASYNCPATHS ;
LOCATE COMP "LED" SITE "41" ;
FREQUENCY NET "clk" 2.08 MHz ;

那么有谁知道如何解决这些时钟警告?

2 个答案:

答案 0 :(得分:1)

我不确定这一行:“wire count_max = 32'd1_000_000;”是可合成的。它可能会被忽略,除非在模拟中(这可能取决于你的工具链 - 它不能用于ASIC,而是用于FPGA ......也许!!)。

行数&gt; = count_max将count计数比较为0(而不是count count),因此这将被视为远离(参见警告)。这就是为什么它能够合成而不做任何事情。

有多种解决方案。 1)改为使用参数(它类似于C ++中的const或C中的#define):

parameter count_max = 32'd1_000_000;

2)只需使用较小的计数器并在溢出时切换

reg [16:0] count; // counts 131,072 cycles

assign led_next = (count == 0 ? ~LED : LED);
always @(posedge clk)
begin
    count <= count + 1;
    LED <= led_next;
end

答案 1 :(得分:1)

解决你的第一个警告可以通过制作一个SDC约束文件告诉你想要的时钟速度来完成。

以下是创建以大约2.08 MHz运行的时钟的示例:

create_clock  -period 480.769 -name {clk} [get_ports {clk}]

期间以ns为单位。 如果要约束的时钟不是输入,则可以使用get_nets而不是get_ports。