银杏科技有限公司旗下技术文档发布平台 | |||
技术支持电话 | 0379-69926675-801 | ||
技术支持邮件 | Gingko@vip.163.com | ||
版本 | 日期 | 作者 | 修改内容 |
---|---|---|---|
V1.0 | 2020-07-01 | gingko | 初次建立 |
//--------顶层模块主要实现各子模块之间的信息交互及与外部信息交互----// module key( input clk_25m, input key, output fpga_ledr, output fpga_ledg, output fpga_ledb ); //--------wire型变量定义,实现模块与模块之间的信号连线------------// wire rst_n; //---------例化复位模块产生全局复位信号,其中u1为例化名-----------// rst_n u1( .clk_25m(clk_25m), .rst_n(rst_n) ); //------------例化按键控制信号,实现按键切换led的功能------------// key_ctrl u2( .clk_25m(clk_25m), .rst_n(rst_n), .key(key), .fpga_ledr(fpga_ledr), .fpga_ledg(fpga_ledg), .fpga_ledb(fpga_ledb) ); endmodule
2、复位模块讲解:
module rst_n( input clk_25m, output rst_n ); //--------------生成复位信号的计数器,采用时序逻辑语言描述----------// reg [3:0]cnt_rst; reg rst_r; always@(posedge clk_25m) if(cnt_rst == 4'd15) begin cnt_rst <= 4'd15; rst_r <= 1'd1; end else cnt_rst <= cnt_rst + 1'd1; assign rst_n = rst_r; endmodule
3、按键控制模块讲解(篇幅原因,不再贴出全部代码讲解,完整代码见例程):
//--------------按键消抖动,提取按键状态----------// always @(posedge clk_25m or negedge rst_n) if (!rst_n) begin key_r <= 1'd0; low_cnt <= 18'd0; hig_cnt <= 18'd0; end //----------检测按键状态为高时,延时10ms,把按键状态提取出来 ------// else if(key) begin low_cnt <= 18'd0; if (hig_cnt == ms_10) begin key_r <= key; hig_cnt <= hig_cnt; end else hig_cnt <= hig_cnt + 1'd1; end reg [1:0]led_cnt; //led_cnt为led状态标志,不同值表示不同led状态 reg ledr,ledg,ledb; //----------------按键下降沿控制led状态切换--------------------// always@(negedge key_state or negedge rst_n) if (!rst_n) begin led_cnt <= 2'd0; end else if (led_cnt == 2'd2) begin led_cnt <= 2'd0; end else led_cnt <= led_cnt + 1'd1; //------------------led状态切换的状态机-----------------------// always@(posedge clk_25m or negedge rst_n) //----- led_cnt=0,红灯亮,led_cnt=1,绿灯亮led_cnt=2,蓝灯亮----// else case(led_cnt) 2'd0: begin ledr <= 1'd0; ledg <= 1'd1; ledb <= 1'd1; end 2'd1: begin ledr <= 1'd1; ledg <= 1'd0; ledb <= 1'd1; end 2'd2: begin ledr <= 1'd1; ledg <= 1'd1; ledb <= 1'd0; end