特权同学深入浅出玩转FPGA课程源代码
首先,感谢特权同学的分享、教导,让向我这样的初学者,能够有一个良好的入门平台。。言归正传,这是我整理出来的代码文档,希望能帮到各位初学者。
1.分频器
- `timescale 1ns / 1ps
- module clkdiv(
- clk,rst_n,
- clk_div
- );
- input clk; //50MHz
- input rst_n; //低电平复位信号
- output clk_div; //分频信号,连接到蜂鸣器
- //---------------------------------------------------
- reg[19:0] cnt; //分频计数器
- always @ (posedge clk or negedge rst_n) //异步复位
- if(!rst_n) cnt <= 20'd0;
- else cnt <= cnt+1'b1; //寄存器cnt 20ms循环计数
- //----------------------------------------------------
- reg clk_div_r; //clk_div信号值寄存器
- always @ (posedge clk or negedge rst_n)
- if(!rst_n) clk_div_r <= 1'b0;
- else if(cnt == 20'hfffff) clk_div_r <= ~clk_div_r; //每20ms让clk_div_r值翻转一次
- assign clk_div = clk_div_r;
- endmodule
复制代码- 8.串口发送接收2
- `timescale 1ns / 1ps
- module my_uart_tx(clk,rst_n,clk_bps,rx_data,rx_int,rs232_tx,bps_start);
- input clk; // 50MHz主时钟
- input rst_n; //低电平复位信号
- input clk_bps; // clk_bps的高电平为接收或者发送数据位的中间采样点
- input[7:0] rx_data; //接收数据寄存器
- input rx_int; //接收数据中断信号,接收到数据期间始终为高电平,在此利用它的上升沿来启动发送数据
- output rs232_tx; // RS232发送数据信号
- output bps_start; //接收或者要发送数据,波特率时钟启动信号置位
- //---------------------------------------------------------
- reg rx_int0,rx_int1,rx_int2; //rx_int信号寄存器,捕捉下降沿滤波用
- wire pos_rx_int; // rx_int下降沿标志位
- always @ (posedge clk or negedge rst_n) begin
- if(!rst_n) begin
- rx_int0 <= 1'b0;
- rx_int1 <= 1'b0;
- rx_int2 <= 1'b0;
- end
- else begin
- rx_int0 <= rx_int;
- rx_int1 <= rx_int0;
- rx_int2 <= rx_int1;
- end
- end
- assign pos_rx_int = rx_int1 & ~rx_int2; //捕捉到上升沿后,neg_rx_int拉地保持一个主时钟周期
- //---------------------------------------------------------
- reg[7:0] tx_data; //待发送数据的寄存器
- //---------------------------------------------------------
- reg bps_start_r;
- reg tx_en; //发送数据使能信号,高有效
- reg[3:0] num;
- always @ (posedge clk or negedge rst_n) begin
- if(!rst_n) begin
- bps_start_r <= 1'bz;
- tx_en <= 1'b0;
- tx_data <= 8'd0;
- end
- else if(pos_rx_int) begin //接收数据完毕,准备把接收到的数据发出去
- bps_start_r <= 1'b1;
- tx_data <= rx_data; //把接收到的数据存入发送数据寄存器
- tx_en <= 1'b1; //进入发送数据状态中
- end
- else if(num==4'd11) begin //数据发送完成,复位
- bps_start_r <= 1'b0;
- tx_en <= 1'b0;
- end
- end
- assign bps_start = bps_start_r;
- //---------------------------------------------------------
- reg rs232_tx_r;
- always @ (posedge clk or negedge rst_n) begin
- if(!rst_n) begin
- num <= 4'd0;
- rs232_tx_r <= 1'b1;
- end
- else if(tx_en) begin
- if(clk_bps) begin
- num <= num+1'b1;
- case (num)
- 4'd0: rs232_tx_r <= 1'b0; //发送起始位
- 4'd1: rs232_tx_r <= tx_data[0]; //发送bit0
- 4'd2: rs232_tx_r <= tx_data[1]; //发送bit1
- 4'd3: rs232_tx_r <= tx_data[2]; //发送bit2
- 4'd4: rs232_tx_r <= tx_data[3]; //发送bit3
- 4'd5: rs232_tx_r <= tx_data[4]; //发送bit4
- 4'd6: rs232_tx_r <= tx_data[5]; //发送bit5
- 4'd7: rs232_tx_r <= tx_data[6]; //发送bit6
- 4'd8: rs232_tx_r <= tx_data[7]; //发送bit7
- 4'd9: rs232_tx_r <= 1'b1; //发送结束位
- default: rs232_tx_r <= 1'b1;
- endcase
- end
- else if(num==4'd11) num <= 4'd0; //复位
- end
- end
- assign rs232_tx = rs232_tx_r;
- endmodule
- `timescale 1ns / 1ps
- module ps2_key(clk,rst_n,ps2k_clk,ps2k_data,rs232_tx);
- input clk; //50M时钟信号
- input rst_n; //复位信号
- input ps2k_clk; //PS2接口时钟信号
- input ps2k_data; //PS2接口数据信号
- output rs232_tx; // RS232发送数据信号
- wire[7:0] ps2_byte; // 1byte键值
- wire ps2_state; //按键状态标志位
- wire bps_start; //接收到数据后,波特率时钟启动信号置位
- wire clk_bps; // clk_bps的高电平为接收或者发送数据位的中间采样点
- ps2scan ps2scan( .clk(clk), //按键扫描模块
- .rst_n(rst_n),
- .ps2k_clk(ps2k_clk),
- .ps2k_data(ps2k_data),
- .ps2_byte(ps2_byte),
- .ps2_state(ps2_state)
- );
- speed_select speed_select( .clk(clk),
- .rst_n(rst_n),
- .bps_start(bps_start),
- .clk_bps(clk_bps)
- );
- my_uart_tx my_uart_tx( .clk(clk),
- .rst_n(rst_n),
- .clk_bps(clk_bps),
- .rx_data(ps2_byte),
- .rx_int(ps2_state),
- .rs232_tx(rs232_tx),
- .bps_start(bps_start)
- );
- endmodule
- `timescale 1ns / 1ps
- module ps2scan(clk,rst_n,ps2k_clk,ps2k_data,ps2_byte,ps2_state);
- input clk; //50M时钟信号
- input rst_n; //复位信号
- input ps2k_clk; //PS2接口时钟信号
- input ps2k_data; //PS2接口数据信号
- output[7:0] ps2_byte; // 1byte键值,只做简单的按键扫描
- output ps2_state; //键盘当前状态,ps2_state=1表示有键被按下
- //------------------------------------------
- reg ps2k_clk_r0,ps2k_clk_r1,ps2k_clk_r2; //ps2k_clk状态寄存器
- //wire pos_ps2k_clk; // ps2k_clk上升沿标志位
- wire neg_ps2k_clk; // ps2k_clk下降沿标志位
- …………
- …………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
完整的Word格式文档51黑下载地址(共54页):
特权同学-深入浅出玩转FPGA源代码.docx
(46.16 KB, 下载次数: 56)
|