2016-10-11 204 views
0

我在寫代碼來實現異步復位d flipfip,但[email protected]線呈現出語法錯誤:異步復位d觸發器代碼語法錯誤

`timescale 1ns/1ps 



module Dflipflop(
input D, 
input reset, 
input clk, 
output Q 

); 
reg Q; 

initial 
begin  
    if(reset==1) //clear the output (Q=0) 
    begin 
     Q <= 0; 
    end 
    else if(reset==0) 
    begin 
     [email protected](posedge clk) //syntax error here... 
     begin 
      Q <= D; 
     end 
    end 
end 

endmodule 

可能是什麼可能的錯誤,並有更好的邏輯來實現它嗎?

回答

0

你不能總是內初始塊。應該這樣寫:

所有的
`timescale 1ns/1ps 


module Dflipflop(
input D, 
input reset, 
input clk, 
output Q 
); 
reg Q; 

always @(posedge clk, posedge reset) 
begin  
    if(reset==1) //clear the output (Q=0) 
    begin 
     Q <= 0; 
    end 
    else 
    begin 
     Q <= D; 
    end 
end 

endmodule 
2

首先,我不鼓勵您使用initial聲明除了在測試平臺。這是不可合成的,所以它不應該出現在RTL中。

那麼我認爲你是一個標準的編程語言,它不是混亂的Verilog。

在Verilog的,有兩類語句:

  • 過程,像alwaysinitial
  • 分配,與assign,允許你一個 '值' 直接分配到導線

在處理過程中可以區分兩類:

  • 同步過程,//do something語句begin end將僅當一個邊緣,在@指定,發生

    always @ (posedge clock) begin 
        //do something 
    end 
    
  • 組合工藝進行評價,//do something語句將每次進行評估在一個使用wirereg的值//do something塊改變

    always @* begin 
        //do something 
    end 
    

這裏喲你在一個過程中實例化了一個沒有物理現實的過程。

另一點,所描述的要激活的過程中,只有當reset==0所以你把一個條件,進入進程。再一次,這在合成方面沒有任何意義。該過程應該被激活,並且正在評估條件。

用於實現d觸發器與異步復位一個經典的溶液如下:

module Dflipflop(
    input D, 
    input reset, 
    input clk, 
    output reg Q 
); 
always @ (posedge clk or negedge reset) begin 
    if (!reset) 
    Q <= 1'b0; // Clear Q when reset negative edge occurs 
    else 
    Q <= D; // Capture D in Q when clk positive edge occurs and reset is high 
end 
endmodule 
0

你應該或者使用初始(未建議用於合成)或始終。一個程序塊不能進入另一個程序塊。如果你對設計一個不可綜合的邏輯真的很感興趣,並且想用初始化來嘗試,你可以按照下面的方式來做。最初和總是程序塊。

.... 

    else if(reset==0) 
     begin 
      repeat(100000) @(posedge clk) 
      begin 
       Q <= D; 
      end 
     end 
    end