我正在努力学习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 ;
那么有谁知道如何解决这些时钟警告?
答案 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。