2012-07-02 42 views
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。警告 - 地圖:C:/ Documents and Settings/belo/Desktop/LedOn2/LedON2.lpf(4):頻率網絡中的錯誤「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 ; 

因此,沒有人知道如何解決這些時鐘警告?

+0

我試圖通過更改我的LPF文件中的代碼來修復大部分警告:FREQUENCY NET「clk」2.08 MHz;到頻率端口「clk」2.08 MHz; 但LED仍不閃爍。 –

+0

現在的錯誤: @W:CL189:「C:\ Documents and Settings \ belo \ Desktop \ LedOn2 \ LEDON.v」:20:0:20​​:5 |寄存器位數[2]始終爲0,優化。 .. @W:CL189:「C:\ Documents and Settings \ belo \ Desktop \ LedOn2 \ LEDON.v」:20:0:20​​:5 |寄存器位計數[1]始終爲0,正在優化.. @W:CL189:「C:\ Documents and Settings \ belo \ Desktop \ LedOn2 \ LEDON。v「:20:0:20​​:5 |寄存器位數[0]始終爲0,優化... @W:MT420 |發現推斷時鐘LEDON |時鐘週期爲1000.00ns。請聲明用戶定義時鐘上的物體「p:clk」 –

+0

你模擬過這個嗎? – 2012-07-02 21:09:19

回答

1

我不確定是否這行:「wire count_max = 32'd1_000_000;」是可合成的。除了仿真之外,它可能會被忽略(這可能取決於您的工具鏈 - 它不適用於ASIC,但對於FPGA也許是合成的)。

行計數> = count_max正在比較計數爲0(而不是最大計數),因此這是optomised(見警告)。這就是爲什麼它能夠綜合但沒有做任何事情。

有多種解決方案。 1)使用一個參數,而不是(這就像C++中的const或#定義在C):

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 
0

解決您的第一個切換警告可以通過製作一個SDC約束文件來告訴你想要的時鐘速度。

下面是用於創建運行在大約2.08兆赫的時鐘的示例:

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

其中週期是在納秒。 如果你想約束的時鐘不是輸入,你可以使用get_nets而不是get_ports。