计数器仿真实验 1
设计思路:需要一个加法器,一个比较器,一个选择器和一个D触发器。加法器将每次的计数值加一,比较器将每次的计数值与计数最大值比较,选择器根据比较器的结果选择输出加法器的结果或计数初始值0,在时钟上升沿通过D触发器将得到的下一个计数值输出。
自行绘制的电路结构RTL设计图
Quartus扫描生成的电路RTL图
电路的波形仿真截图
HDL代码
module counter1(
RST , // 异步复位, 高有效
CLK , // 时钟,上升沿有效
CNTVAL);
input RST , CLK ;
output [2:0] CNTVAL;
reg [2:0] CNTVAL, cnt_next;
parameter CNT_MAX_VAL = 6;
always @(CNTVAL) begin
if(CNTVAL < CNT_MAX_VAL) begin
cnt_next = CNTVAL + 1'b1;
end
else begin
cnt_next = 0;
end
end
always @ (posedge CLK or posedge RST) begin
if(RST)
CNTVAL <= 0;
else
CNTVAL <= cnt_next;
end
endmodule
计数器仿真实验 2
设计思路:因为计数最大值也在变化,可采用两个简单计数器连接在一起组成。前一个计数器输出后一个计数器的计数最大值,后一个计数器输出最终计数值,其中后一个计数器中比较器的结果作为前一个计数器是否加1的控制条件。
自行绘制的电路结构RTL设计图
Quartus扫描生成的电路RTL图
电路的波形仿真截图
HDL代码
module counter2(
CLK,
CNT,
RST);
input RST, CLK;
output reg [3:0] CNT;
integer MAX = 6;
always @ (posedge CLK or posedge RST) begin
if(RST)
CNT = 0;
else begin
if (CNT < MAX) begin
CNT = CNT + 1'b1;
end
else begin
CNT = 0;
if (MAX < 9) begin
MAX = MAX + 1;
end
else begin
MAX = 6;
end
end
end
end
endmodule