一.示例部分
(1)重点代码:
1.时间基准模块
modulecnt_sync(
CLK , // clock
CNTVAL, // counter value
OV ); // overflow
input CLK;
output [32-1:0] CNTVAL;
output OV;
parameter MAX_VAL = 25_000_000;
reg [32-1:0] CNTVAL;
regOV;
always@ (posedgeCLK) begin
if(CNTVAL >= MAX_VAL)
CNTVAL <= 0;
else
CNTVAL <= CNTVAL + 1'b1;
end
always@ (CNTVAL) begin
if(CNTVAL == MAX_VAL)
OV = 1'b1;
else
OV = 1'b0;
end
endmodule //module cnt_sync
2.带使能端的计数器:
module cnt_en_0to9(
CLK , // clock
CNTVAL, //counter value
EN ,
OV ); // overflow
input CLK;
input EN;
output [4-1:0] CNTVAL;
output OV;
reg [4-1:0] CNTVAL;
reg OV;
always @ (posedgeCLK) begin
if(EN) begin // work enable
if(CNTVAL >= 9)
CNTVAL <= 0;
else
CNTVAL <= CNTVAL + 1'b1;
end
else
CNTVAL <= CNTVAL ; // hold same value
end
always @ (CNTVAL) begin
if(CNTVAL == 9)
OV = 1'b1;
else
OV = 1'b0;
end
endmodule // module cnt_en_0to9
3.计数器(从带使能端的改进出来)
(2)重点问题:此时已将时间基准模块的最大计数参数(parameter MAX_VAL)改成5。此举原因:在进行仿真时,设置clk信号的Time period最大合法区间可到1微秒,不支持更长时间,因而过大则看不到想要的波形变化。仿真结果如下:
二.学生实验:
1.2合并完成,0-15计数器寄存器宽度不变。代码参考上面模9计数器。生成的BDF图如下:(计时时间0.1秒)
3.
更新后代码如下(包括清零和暂停的代码,但3中并没有设置相应开关):
module cnt_en_0to9(
CLK , // clock
CNTVAL, // counter value
EN ,
RESET ,
OV ); // overflow
input CLK;
input EN;
input RESET;
output [4-1:0] CNTVAL;
output OV;
reg [4-1:0] CNTVAL;
reg OV;
always @ (posedge CLK) begin
if(RESET) begin
CNTVAL <= 0;
end
else if(EN) begin // work enable
if(CNTVAL >= 9)
CNTVAL <= 0;
else
CNTVAL <= CNTVAL + 1'b1;
end
else
CNTVAL <= CNTVAL ; // holdsame value
end
always @ (CNTVAL) begin
if(CNTVAL == 9)
OV = 1'b1;
else
OV = 1'b0;
end
endmodule // module cnt_en_0to9
生成BDF如图所示:
管脚分配图如下:
4.
BDF图如下,代码见3.