實驗内容
作業要求
第一種方法:異步高電平複位
手工繪制的電路結構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圖
計數器的波形仿真截圖
- 計數器在電路複位後會循環的從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圖
計數器的波形仿真截圖
- 同步高電平複位:隻有在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通過雙路選擇器确定兩個寄存器的初值。