天天看點

作業1:計數器仿真實驗作業實驗内容第一種方法:異步高電平複位第二種方法:同步高電平複位兩種方法比較

實驗内容

作業要求

第一種方法:異步高電平複位

手工繪制的電路結構RTL設計圖

  • 思路:本題計數器需要用到的RTL符号有2個4位寄存器、2個雙路選擇器、2個加法器、2個比較器
    • 異步高電平複位:複位信号隻要變高電平就立即執行複位操作。CNT(計數值)預置初值為零;CNT_VAL_MAX(計數最大值)預置初值4’b0110(即CNT_VAL_min)。
    • 判斷CNT與CNT_VAL大小,若CNT>=CNT_VAL,則雙路選擇器選通輸出4’h0給CNT寄存器的輸入端;否則CNT計數+1再将其通過雙路選擇器選通輸出送入CNT寄存器的輸入端。如下圖框内①
    • 此外,當CNT>=CNT_VAL時,CNT_VAL計數+1并與9(即CNT_VAL_MAX)比較:若CNT_VAL>=9,則雙路選擇器選通輸出4’h6給CNT_VAL寄存器的輸入端;否則再将CNT_VAL原值送回CNT_VAL寄存器的輸入端。如下圖框内②
  • 手工繪制RTL圖:
    作業1:計數器仿真實驗作業實驗内容第一種方法:異步高電平複位第二種方法:同步高電平複位兩種方法比較

Quartus掃描生成的電路RTL圖

作業1:計數器仿真實驗作業實驗内容第一種方法:異步高電平複位第二種方法:同步高電平複位兩種方法比較

計數器的波形仿真截圖

  • 計數器在電路複位後會循環的從0值遞增計數到最大值,計數最大值是一個循環變化的過程,計數器複位之後,第一次計數最大值是6,然後是7、8、9,然後計數最大值又變成6,如此往複循環,計數過程如下圖所示。
    作業1:計數器仿真實驗作業實驗内容第一種方法:異步高電平複位第二種方法:同步高電平複位兩種方法比較
  • 異步高電平複位:複位信号隻要變成高電平就執行複位操作,如下圖所示。
    作業1:計數器仿真實驗作業實驗内容第一種方法:異步高電平複位第二種方法:同步高電平複位兩種方法比較

計數器代碼

module cnt_circle_0to9(
  CLK   ,   // clock
  RST   ,   //reset
  CNT);   // output
input CLK;//clock
input RST;//reset,
output [-:] CNT;//output counter value

parameter CNT_VAL_MIN=;//counter cycle min value
parameter CNT_VAL_MAX=;//counter cycle max value
reg [-:] CNT;
reg [-:] CNT_VAL=CNT_VAL_MIN;

//異步高電平複位就是複位信号隻要變高電平就執行複位操作,如果是同步的話就要看複位信号是否在時鐘有效沿為高電平。
//異步高電平複位
always @ (posedge CLK or posedge RST)begin
    if(RST)begin
        CNT <= ;
        CNT_VAL <= CNT_VAL_MIN;
    end
    else begin  
        if(CNT >= CNT_VAL)begin         //Less Than0
            CNT <= ;
            CNT_VAL <= CNT_VAL + 'b1;  //ADD0,非阻塞指派,同時完成
            if(CNT_VAL >= CNT_VAL_MAX)          //Less Than1
                CNT_VAL <= CNT_VAL_MIN;
        end
        else CNT <= CNT + 'b1;         //ADD1
    end
end
同步高電平複位
//always @ (posedge CLK) begin
//  if(RST)begin
//      CNT <= 0;
//      CNT_VAL <= CNT_VAL_MIN;
//  end
//  else begin
//      if(CNT >= CNT_VAL)begin         //Less Than0
//          CNT <= 0;
//          CNT_VAL <= CNT_VAL + 1'b1;  //ADD1
//          if(CNT_VAL >= CNT_VAL_MAX)              //Less Than1
//              CNT_VAL <= CNT_VAL_MIN;
//      end
//      else CNT <= CNT + 1'b1;         //ADD0
//  end
//end

endmodule   // module cnt_circle_0to9
           

第二種方法:同步高電平複位

手工繪制的電路結構RTL設計圖

  • 思路:本題計數器需要用到的RTL符号有2個4位寄存器、5個雙路選擇器、2個加法器、2個比較器
    • 同步高電平複位:隻有在時鐘有效沿複位信号為高電平時,才進行複位操作。是以兩個寄存器前分别需要一個雙路選擇器,由RST選擇通路。接下來的思路與異步複位類似。
  • 手工繪制RTL圖:
    作業1:計數器仿真實驗作業實驗内容第一種方法:異步高電平複位第二種方法:同步高電平複位兩種方法比較

Quartus掃描生成的電路RTL圖

作業1:計數器仿真實驗作業實驗内容第一種方法:異步高電平複位第二種方法:同步高電平複位兩種方法比較

計數器的波形仿真截圖

  • 同步高電平複位:隻有在CLK上升沿當複位信号為高電平才執行複位操作,如下圖所示。
    作業1:計數器仿真實驗作業實驗内容第一種方法:異步高電平複位第二種方法:同步高電平複位兩種方法比較

計數器代碼

  • 代碼見上面代碼被注釋部分。
    作業1:計數器仿真實驗作業實驗内容第一種方法:異步高電平複位第二種方法:同步高電平複位兩種方法比較
    作業1:計數器仿真實驗作業實驗内容第一種方法:異步高電平複位第二種方法:同步高電平複位兩種方法比較
module cnt_circle_v2_0to9(
  CLK   ,   // clock
  RST   ,   //reset
  CNT);   // output
input CLK;//clock
input RST;//reset,
output [-:] CNT;//output counter value

parameter MAX_min=;//counter cycle min value
parameter MAX_max=;//counter cycle max value


reg [-:] CNT_maxR = MAX_min;//count for MAX
reg enR , ovR ;
reg [-:] CNT_resultR;//count for result

//異步高電平複位就是複位信号隻要變高電平就執行複位操作,如果是同步的話就要看複位信号是否在時鐘有效沿為高電平。
//異步高電平複位

always @ (posedge CLK)begin
    if(RST)begin
        CNT_resultR <= ;
        CNT_maxR <= MAX_min;
    end
    else begin
        if(CNT_resultR < CNT_maxR)begin
            CNT_resultR <= CNT_resultR + 'b1;
        end
        else begin
            CNT_resultR <= ;
        end

        if(enR)begin
            if(CNT_maxR < MAX_max)begin
                CNT_maxR <= CNT_maxR + 'b1;
            end
            else
                CNT_maxR <= MAX_min;
        end
        else
            CNT_maxR <= CNT_maxR ;
    end
end
always @ (CNT_resultR)begin
    enR = ovR;
    if(CNT_resultR == CNT_maxR)
        ovR = ;
    else
        ovR = ;
end
assign CNT = CNT_resultR;
endmodule   // module cnt_circle_v2_0to9
           

兩種方法比較

  • 差異從兩方面看:
    • 波形仿真:異步複位,從RST=0時立即執行複位操作,計數清零;同步複位,隻有在CLK上升沿RST=1才執行複位。
    • RTL圖:異步複位時,是通過RST給CNT和CNT_VAL寄存器分别預置初值;同步複位是RST通過雙路選擇器确定兩個寄存器的初值。

繼續閱讀