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, [" Yposedge 等待CLK上升沿; i; w0 D/ S4 L5 `0 O$ J S+ [
negedge 等待RST下降沿
, S3 Y0 |6 R/ q' lalways之间是并行的,它是一直在检测触发条件,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 |