扫一扫,分享给好友
新手入门的简单小例子第二个,这几个例子主要给入门的新手建立时间或者说时序的概念,最近看了不少的资料基本上都是以点灯为例,估计是大家对嵌入式开发和FPGA的普遍共识,这两天逛B站发现了也不少比较好的视频教程,我就在这里二次提炼一下,做上几篇文章,为大家的学习垫上两块砖头,现在这一篇是第二篇。 实验之前: (1)默认对应的FPGA外部输入时钟为50MHz,这样对应的时钟周期就为20ns(当然其他的频率也可以,这里以50MHz时钟来举例); (2)不限制开发板类型、IDE类型; (3)实现目的:按照图示完成对应的功能即LED按照“点亮0.25秒→熄灭0.5秒→亮0.75秒→熄灭1秒”的规律,持续循环; (4)对应的时序示意图如下: 对应的计数的最大值为: 我们所需要用到的时间标志点:
对应的code:
module led_ctrl_2( input wire clk, input wire rst_n, output reg led ); parameter CNT_025S_MAX = 31'd12_500_000 - 1; //0.25S parameter CNT_075S_MAX = 31'd37_500_000 - 1; //0.75S parameter CNT_1S5_MAX = 31'd75_500_000 - 1; //1.5S parameter CNT_2S5_MAX = 31'd125_000_000 - 1;//2.5S //为什么要减1,大家可以思考一下从0到9是几个数,如果认为是9个的那么可以放弃学习FPGA了 //完成1秒的计数周期 reg [30:0] counter; always @(posedge clk or negedge rst_n) if( rst_n == 1'b0 ) counter <= 31'b0; else if( counter == CNT_2S5_MAX ) counter <= 31'b0; else counter <= counter + 1'b1; //在这里建议能在对应的数值前加上位数的还是加上位数,我记得不加位数会被默认为32位,不知道是不是还是这样 //在1秒的周期内设定对应led翻转的时间节点并完成操作 always @(posedge clk or negedge rst_n) if( rst_n == 1'b0 ) led <= 1'b1; //因起始位高电平 else if( counter == CNT_025S_MAX ) led <= ~led; else if( counter == CNT_075S_MAX ) led <= ~led; else if( counter == CNT_1S5_MAX ) led <= ~led; else if( counter == CNT_2S5_MAX ) led <= ~led; else led <= led; //避免产生锁存器 endmodule
对应的测试code:
`timescale 1ns/1ns module tb_led_ctrl_1(); //****************** Parameter and Internal Signal *******************// //wire define wire led; //reg define reg clk; reg rst_n; //***************************** Main Code ****************************// initial begin clk = 1'b1; rst_n <= 1'b0; #201 rst_n <= 1'b1; #2_000_000; $stop; end //参数重定义缩短仿真时间(大家的时间很宝贵,尽量不要浪费) defparam led_ctrl_2_inst.CNT_025S_MAX = 31'd12_50 - 1; defparam led_ctrl_2_inst.CNT_075S_MAX = 31'd37_50 - 1; defparam led_ctrl_2_inst.CNT_1S5_MAX = 31'd75_50 - 1; defparam led_ctrl_2_inst.CNT_2S5_MAX = 31'd125_00 - 1; // creator clk always #10 clk <= ~clk; //*************************** Instantiation **************************// led_ctrl_2 led_ctrl_2_inst ( .clk ( clk ), .rst_n ( rst_n ), .led ( led ) ); endmodule
最后对应的图片使用了小梅哥视频中的图,特此表示感谢!
发布
FPGA入门fpga
AIBOX-3588M,为终端提供算力,基于RK3588平台!
教程!FPGA DDR4读写实验(1)
【有奖提问】关于盘古1K2K开发板你有什么想知道的?一起来留言获取答案吧!
盘古22K开发板
盘古200 pro开发板
盘古50 pro开发板
盘古50K开发板
盘古100 pro开发板
FPGA在图像处理领域的优势有哪些?
紫光同创——PLL IP 的使用(Logos2)
电子发烧友网
电子发烧友论坛