2013-01-21 51 views
1

我做的Verilog的計數器,並在硬件中實現它。但我無法解釋行爲的代碼是:Verilog的計數器實現意外的行爲

module clock_test(clk_in,led,rst); 
input wire clk_in; 
input wire rst; 
output wire [7:0] led; 

reg [23:0] counter = 24'b0; 

assign led = counter[23:16]; 

always @(posedge clk_int) begin 
    if(rst) begin 
    counter <= 0; 
    end 
else begin 
    counter <= counter +1; 
    end 
end 
endmodule // clock_test 

在硬件上,當我打rst,LED的凍結在它被計數點。它並不完全是零。斷言rst,並且您可以看到除零之外的一些隨機模式,除非我發佈rst,否則這些隨機模式不會更改。

我的問題是:當if(rst) begin塊執行時,counter設置爲0.由於LED從counter分配爲組合邏輯,應該不會立即反映嗎?

+1

當'rst'爲低電平時計數器是否正常工作? always塊上的時鐘不正確。應該是'clk_in',而不是'clk_int'。 – Greg

+0

該代碼不適合我編譯。 'clk_int'真的應該是'clk_in'嗎? – toolic

+0

是啊,這是一個錯字,我實際上可以得到它的工作,並和我關心的是在硬件已經:) –

回答

4

既然你有一個同步復位復位值復位後斷言不會生效,直到下一個時鐘邊沿。

當斷言復位這是否也停止時鐘?這似乎是最可能的原因,否則你的代碼看起來是正確的(除了Greg提到的語法錯誤)。

1

它看起來像CLK是typod,這是一個同步復位,而不是異步。

試試這個:

module clock_test(
    input  clk_in, 
    input  rst, 
    output [7:0] led 
); 

reg [23:0] counter; 

assign led = counter[23:16]; 

always @(posedge clk_in or posedge rst) begin 
    if(rst) begin 
    counter <= 0; 
    end 
    else begin 
    counter <= counter +1; 
    end 
end 
endmodule // clock_test 

注意:您使用的是高有效復位(1意味着復位)。如果您實際使用低電平有效(0復位),則需要更改以下內容:

always @(posedge clk_in or negedge rst) begin 
    if(~rst) begin 
    counter <= 0; 
+0

使其成爲異步的伎倆的行爲!非常感謝@Munkymorgy和@BrianMagnuson,您的所有假設都是正確的,因爲第一個連接到DCM_SP的復位輸入,設計實際上停止了來自數字時鐘管理圖塊DCM_SP實例(Xilinx FPGA Specific)的clk。我實際上從中剝離了一些Xilinx FPGA專用代碼。以下是完整版本:http://pastebin.com/NZXcEyxj再次感謝大家! :) –

+0

沒問題,傑伊,因爲你是新的StackOverflow可能我建議,如果你有一個正確的答案,你應該接受它。我可以建議Brian Magnusons,因爲他是第一個。對其他人的讚揚將很樂意接受。 – Morgan

+0

完成! :)但這些最小字符的評論! –