如何创建工程 新建一个测试平台 如何模拟 如何编译 如何配置引脚 如何导入程序 前面文章都已经介绍过了 这里不赘述了 大部分朋友已经学会了 很简单 如果又忘记了 可以看前面的文章复习一下
实验目的:
做一个2s为周期,每1s取反一次的led 1s亮 1s灭 计数器为时间1s
思路
因为我们的时钟为20ns一周期 所以我们需要计数50000000个个数才可以
二进制寄存器位宽为26 也就是 0到25 因为0是第一个数
代码
module f410(
clk,
rst_n,
led
);
input clk;
input rst_n;
output reg led;
reg [25:0]cnt;
//计数部分
always@(posedge clk or negedge rst_n)// 时钟上升沿 复位下降沿时 则
begin
if(!rst_n)//复位
cnt<=0;//计数归零 (非阻塞赋值)
//else if(cnt==26'd49_999) //测试平台的时候用 因为我们测试只需要验证正确性 所以时间可以取短一些
else if(cnt==26'd49_999_999)//计数满了
cnt<=0;//归零
else //计数没满 没复位
cnt<=cnt+1;//计数加一 (计49999999个数 一个数 20ns 也就是1s)
end
//led部分
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)//复位
led<=1;//不亮
//else if(cnt==26'd49_999)//测试平台的时候用
else if(cnt==26'd49_999_999//计数满了
led<=~led;//led取反
else
led<=led; //计数没满 led不变
end
endmodule
测试平台
`timescale 1ns/1ns//时标 分辨率 1s
module f410_tb;
reg clk;
reg rst_n;
wire led;
f410 u1 (
.clk(clk),
.rst_n(rst_n),
.led(led)
);
initial //激励 (给初始值)
begin
clk=0;
rst_n=0;
#100 rst_n=1;//100ns后不复位了
#2000_000; // 2000000ns
//#4000_000;//实际测试时候用 4000000ns 因为我们前面想测试时候时间短一点 则这个可以稍长方便观测
$stop;
end
always #10 clk=~clk; //10ns 时钟取反
endmodule
我们把上面注释部分 取消注释 进行模拟(把上面与其一个意思的语句注释掉,导入板子的时候恢复)
模拟现象
符合实验预期
配置引脚(根据原理图 按照自己板子自行配置)
配置好引脚 然后全局编译 之后导入程序
然后通过我们的板子 就可以观测到实验现象 经验证 无误