1、设计一个0-17的计数器,当计数值为17的时候,OV输出1,其他输出0,注意设定合理的信号位宽。
首先写一个0到17的verilog代码如下:
module cnt_0to17(
CLK,
CNTVAL,
OV);
input CLK;
output [4:0] CNTVAL;
output OV;
reg [4:0] CNTVAL;
reg OV;
always @(posedge CLK)
begin
if(CNTVAL>=17)
CNTVAL <= 0;
else
CNTVAL <= CNTVAL + 1'b1;
end
always @(CNTVAL)
begin
if(CNTVAL==17)
OV=1'b1;
else
OV=1'b0;
end
endmodule
其次将verilog文件加入到project中,随后创建符号。
建立BDF文件,画电路模块图如下:
RTL View
波形仿真:
signal tap数据分析:
2、针对以上计数器,修改输出逻辑,当计数值为0-8时,OV输出0,9-17时OV输出1
首先改写verilog代码如下:
module cnt_0to17(
CLK,
CNTVAL,
OV);
input CLK;
output [4:0] CNTVAL;
output OV;
reg [4:0] CNTVAL;
reg OV;
always @(posedge CLK)
begin
if(CNTVAL>=17)
CNTVAL <= 0;
else
CNTVAL <= CNTVAL + 1'b1;
end
always @(CNTVAL)
begin
if(CNTVAL>=9)
OV=1'b1;
else
OV=1'b0;
end
endmodule
用SignalTap验证:
尝试并思考,如果时钟是50MHz,把OV接到一个LED上,能看见什么现象,为什么?
答:如果时钟是50MHz,LED灯会一直亮,因为频率太高,肉眼分辨不出来亮灭,所以会一直认为灯一直亮。