找回密码
 注册
关于网站域名变更的通知
查看: 467|回复: 1
打印 上一主题 下一主题

转——从零开始学FPGA——by ihalin——实现让LED灯每50ms翻转一次

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-1 11:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
转——从零开始学FPGA——by ihalin——实现让LED灯每50ms翻转一次
( K* |! [0 o: N. I/ \) F
' c8 S6 \8 i) a6 R2 [6 ]
这是我前面做的实验 实验一和实验二 计划每天一个) B7 \+ w# K- z- F- e
下面是第三个实验计数器实验* m$ W8 N# B8 U
实现让LED灯每50ms翻转一次" [* {; l) i2 j/ b' V; f
1 y) a/ p  u  E
原理是连接50MHZ的晶振 50MHZ=50_000_000HZ 时间是  1/50_000_000秒=20ns
) [1 T0 H' J1 w9 r7 e* D# h
所以计数的次数CNT=50_000_000/20=25_000_000次因为计数是从0开始计数的所以只需要计数到24_999_999即可
4 F! S: I/ a9 [
开始时序逻辑电路了
# @* G: f3 u* {: t  i, [" Y
posedge 等待CLK上升沿; i; w0 D/ S4 L5 `0 O$ J  S+ [
negedge 等待RST下降沿
, S3 Y0 |6 R/ q' l
always之间是并行的,它是一直在检测触发条件,always内部是顺序执行的。
. Z) c1 k# W. ]1 k4 o# ]
下面是代码
1. module counter(Clk50M,Rst_n,led);
2.         input Clk50M;//系统时钟,50M=20ns
3.         input Rst_n;//全局复位,低电平复位
4.         output reg led;//led输出
5.         reg [24:0]cnt;//500ms=500_000_000ns/20ns = 25000 000
6. //计数器的进程        
7.         always@(posedge Clk50M or negedge Rst_n)//在系统时钟是上升沿时候或者是复位的下降沿
8.                 if(Rst_n == 1'b0)//如果发生了复位则计数器清零
9.                         cnt <= 25'd0;
10.       else if(cnt == 25'd24_999_999)//如果计数到了24 999 999时候则计数器清零
11.                         cnt <= 25'd0;
12.            else
13.                         cnt <= cnt +1'b1;//否则计数器自加1        
14.                        
15. //led的进程                        
16.         always@(posedge Clk50M or negedge Rst_n)//在系统时钟是上升沿时候或者是复位的下降沿
17.                 if(Rst_n == 1'b0)
18.                         led <= 1'b0;
19.                 else if(cnt == 25'd24_999_999)
20.                         led <= ~led;
21.                 else
22.                         led <= led;
23.                 
24.         
25. endmodule        
26.        
然后是testbench
8 a! L2 @8 y, V" X
使用宏定义方便代码修改
1. `timescale 1ns/1ns//仿真时间步进和精度
2. `define clock_period 20
3. module counter_tb;
4.   reg clk;
5.   reg rst_n;
6.   
7.   wire led;
8.   
9.
10. counter ct0(
11.                         .Clk50M(clk),
12.                         .Rst_n(rst_n),
13.                         .led(led)
14.                         );
15.                        
16.         initial clk =1;
17.         always #(`clock_period/2) clk =~clk;
18.         
19.         initial begin
20.                 rst_n = 1'b0;
21.                 #(`clock_period*200);
22.                 rst_n = 1'b1;
23.                 #2000000000;
24.                 $stop;
25.                 
26.         
27.         end
28.
29.
30. endmodule
31.
然后是RTL的仿真实验
) A. o: x  v5 h3 h

# S4 y, o0 M& ^& C5 w
符合设计; o; O- _1 {0 B( F9 ~
然后是门级仿真" [3 d2 `1 W9 R# T/ L) b3 x
! F. S" N# H7 W+ e: t. |& J% [
然后是下载到板子上
. K2 Y9 s% I% S6 I! k

- G# \, w6 j& D
一闪一闪的时间估计对的上。

" y: u0 F; m6 H) c2 I' p1 X

该用户从未签到

2#
发表于 2019-4-1 16:48 | 只看该作者
没问题 对上了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-30 14:30 , Processed in 0.140625 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表