特權同學深入淺出玩轉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)
2018-8-29 12:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|