1 基础概念
2 实战指南
2.1 设计规划
1 设计要求
2 基础规划
2.2 波形绘制
计算
方法1:计数器位宽26
方法二:计数器位宽25
2.3 代码编写和调试
module counter
(
input wire sys_clk,
input wire sys_rst_n,
output wire led_out
);
parameter CNT_MAX = 25'd 24_999_999; // localparam 只能用于 模块内部使用。parameter 可以从module中入口修改参数,使用#(CNT=1000)counter 例化
reg [24:0] cnt;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 25'd0;
else if(cnt == CNT_MAX)
cnt <= 25'd0;
else
cnt <= cnt + 1;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
led_out <= 1'b0;
else if(cnt == CNT_MAX)
led_out <= ~ led_out;
else // 如果无效 保持原来的电平
led_out <= led_out;
endmodule
`timescale 1ns/1ns
module tb_counter();
reg sys_clk;
reg sys_rst_n;
wire led_out;
initial begin
sys_clk = 1'b1;
sys_rst_n <= 1'b0;
#20
sys_rst_n <= 1'b1;
end
always #10 sys_clk =~sys_clk;
counter
#(
.CNT_MAX(24)
) counter_inst
(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),
.led_out(led_out)
);
endmodule
2.4 逻辑仿真和波形对比
2.5 锁定管脚和上板测试