2

我正在学习 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 中的错误;
警告 - 地图:首选项解析结果:检测到 1 个语义错误
警告 - 地图:首选项文件“C:/Documents and Settings/belo/Desktop/LedOn2/LedON2.lpf”中有错误。
警告 - 地图:首选项文件“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 ;

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

4

2 回答 2

1

我不确定这条线是否:“wire count_max = 32'd1_000_000;” 是可综合的。除了在模拟中它可能会被忽略(这可能取决于您的工具链 - 它对于 ASIC 是不可合成的,但对于 FPGA ......也许!!)。

行 count>= count_max 将 count 与 0(而不是 count max)进行比较,因此这被优化掉了(见警告)。这就是为什么它设法合成但不做任何事情的原因。

有多种解决方案。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
于 2012-07-03T06:34:01.297 回答
1

解决您的第一个警告可以通过制作一个 SDC 约束文件来告知您希望拥有的时钟速度。

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

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

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

于 2016-12-22T12:35:18.897 回答