建議你先將BZQ,TSQ設成常數,再試試。
看了你的程式碼,覺得除了設計之外,有幾個問題。
1.verilog不是C語言。實現乘除法時,直接寫運算子雖然可以綜合,但邏輯很深,時序會很差。例如:if(cnt=(BZQ/TSQ)*duty/100),這樣的邏輯深度是可怕的,估計只能跑到幾MHz。你所遇到的問題不排除是時序問題(timing issue)。
2.第一個always塊很不規範,而且不是同步電路。更好的實現方法是:
always @(posedge BCLK)
begin
if(~START)
start
end
3.系統沒有復位訊號。所有的數字系統應當有系統復位。always塊應當用這樣的模板:
always @(posedge mclk or posedge mrst)
if(mrst)
reg1
else
if (...)
4.訊號或暫存器名稱不能靠大小寫區分。雖然verilog大小寫是敏感的,但沒有公司會允許大小寫混用,一般都規定統一大寫或小寫,更何況是一樣的名稱,僅靠大小寫區分。如START,可以改成,start_in。
建議你先將BZQ,TSQ設成常數,再試試。
看了你的程式碼,覺得除了設計之外,有幾個問題。
1.verilog不是C語言。實現乘除法時,直接寫運算子雖然可以綜合,但邏輯很深,時序會很差。例如:if(cnt=(BZQ/TSQ)*duty/100),這樣的邏輯深度是可怕的,估計只能跑到幾MHz。你所遇到的問題不排除是時序問題(timing issue)。
2.第一個always塊很不規範,而且不是同步電路。更好的實現方法是:
always @(posedge BCLK)
begin
if(~START)
begin
start
end
end
3.系統沒有復位訊號。所有的數字系統應當有系統復位。always塊應當用這樣的模板:
always @(posedge mclk or posedge mrst)
begin
if(mrst)
begin
reg1
end
else
begin
if (...)
begin
reg1
end
else
begin
reg1
end
end
end
4.訊號或暫存器名稱不能靠大小寫區分。雖然verilog大小寫是敏感的,但沒有公司會允許大小寫混用,一般都規定統一大寫或小寫,更何況是一樣的名稱,僅靠大小寫區分。如START,可以改成,start_in。