在數字電路中經常有同步synchronism、異步asynchronism的概念。異步指輸入信號和時鍾無關;同步指輸入信號和時鍾信號有關,實際上就是輸入信號和時鍾信號進行了與運算或者與非運算。實際開發中,經常有同步清零、異步清零、同步復位、異步復位等概念,下面就給與相關代碼演示。
簡單的異步復位
1 always @ (posedge clk or negedge rst_n) 2 if(!rst_n) b <= 1'b0; 3 else b <= a;
簡單的同步復位
1 always @ (posedge clk) 2 if(!rst_n) b <= 1'b0; 3 else b <= a;
PS:同步復位信號RST必須至少長於一個時鍾周期CLK,否則,這個復位信號引起的變化是不會被檢測到的!
異步復位、同步釋放
1 always @ (posedge clk) 2 rst_nr <= rst_n; //現將異步復位信號用同步時鍾打一拍 3 4 always @ (posedge clk or negedge rst_nr) 5 if(!rst_nr) b <= 1'b0; 6 else b <= a; 7 8 always @ (posedge clk or negedge rst_nr) 9 if(!rst_nr) c <= 1'b0; 10 else c <= b;
同步復位和異步復位的區別就在於 前者的復何信號不能出現在always語句的敏感信號表中,無論是同步復位還是異步
復位,always語句的結構都是if(Reset)...else... ,否則,綜合工具將不能正確的綜合
所有always語句中的賦值最好采用非阻塞賦值語 ,否則,可能會導致仿真與綜合的不一致”
