EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
转——从零开始学FPGA——by ihalin——实现让LED灯每50ms翻转一次 # ]" ]$ H# k" y/ x
( A' F! `* y4 V4 d% N这是我前面做的实验 实验一和实验二 计划每天一个
, n- [2 C" Y- h- m下面是第三个实验计数器实验
5 S3 z, r+ D: o7 w# y& g$ ]9 q; b实现让LED灯每50ms翻转一次( s9 K O( d8 w9 N* r1 J+ V
1 B/ s* y0 e! R5 H( n8 t
原理是连接50MHZ的晶振 50MHZ=50_000_000HZ 时间是 1/50_000_000秒=20ns3 q; Y, R! Y. n5 S# P
所以计数的次数CNT=50_000_000/20=25_000_000次因为计数是从0开始计数的所以只需要计数到24_999_999即可
1 p$ l' p6 {3 v, i( Q1 y开始时序逻辑电路了
$ ?# R: p6 c4 }+ H# r/ q/ P& Vposedge 等待CLK上升沿. p2 [( u6 b% D3 ?8 k
negedge 等待RST下降沿2 k" Z$ ~" ]% P1 [
always之间是并行的,它是一直在检测触发条件,always内部是顺序执行的。% n8 {! v7 ?1 \; X
下面是代码 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
5 |5 x. `3 }! S1 s3 x$ e8 a使用宏定义方便代码修改 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的仿真实验
3 {- m& H/ F4 M$ ~$ V
# j) Y' m, C' F( C- M符合设计
" M$ o- `/ K2 N( D9 C然后是门级仿真- w3 x+ a8 U( B$ \8 i6 ?
4 @) s- \$ t& {/ ^, p& g; e6 S然后是下载到板子上
5 U: O$ J" w: n( \: k, O
; ?' `( _$ R+ C' X& j一闪一闪的时间估计对的上。
; p8 ~8 {2 ?0 H, J k$ W9 x4 | |