久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4590|回復: 1
打印 上一主題 下一主題
收起左側

特權同學深入淺出玩轉FPGA源代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:391144 發表于 2018-8-29 12:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
特權同學深入淺出玩轉FPGA課程源代碼
  首先,感謝特權同學的分享、教導,讓向我這樣的初學者,能夠有一個良好的入門平臺。。言歸正傳,這是我整理出來的代碼文檔,希望能幫到各位初學者。

1.分頻器
  1. `timescale 1ns / 1ps
  2. module clkdiv(
  3.                         clk,rst_n,
  4.                         clk_div       
  5.                 );
  6. input clk;                //50MHz
  7. input rst_n;        //低電平復位信號
  8. output clk_div;        //分頻信號,連接到蜂鳴器
  9. //---------------------------------------------------
  10. reg[19:0] cnt;        //分頻計數器
  11. always @ (posedge clk or negedge rst_n)        //異步復位
  12.         if(!rst_n) cnt <= 20'd0;
  13.         else cnt <= cnt+1'b1;        //寄存器cnt 20ms循環計數
  14. //----------------------------------------------------
  15. reg clk_div_r;        //clk_div信號值寄存器
  16. always @ (posedge clk or negedge rst_n)
  17.         if(!rst_n) clk_div_r <= 1'b0;
  18.         else if(cnt == 20'hfffff) clk_div_r <= ~clk_div_r;        //每20ms讓clk_div_r值翻轉一次
  19. assign clk_div = clk_div_r;       
  20. endmodule
復制代碼
  1. 8.串口發送接收2
  2. `timescale 1ns / 1ps
  3. module my_uart_tx(clk,rst_n,clk_bps,rx_data,rx_int,rs232_tx,bps_start);

  4. input clk;                        // 50MHz主時鐘
  5. input rst_n;                //低電平復位信號
  6. input clk_bps;                // clk_bps的高電平為接收或者發送數據位的中間采樣點
  7. input[7:0] rx_data;        //接收數據寄存器
  8. input rx_int;                //接收數據中斷信號,接收到數據期間始終為高電平,在此利用它的上升沿來啟動發送數據
  9. output rs232_tx;        // RS232發送數據信號
  10. output bps_start;        //接收或者要發送數據,波特率時鐘啟動信號置位

  11. //---------------------------------------------------------
  12. reg rx_int0,rx_int1,rx_int2;        //rx_int信號寄存器,捕捉下降沿濾波用
  13. wire pos_rx_int;                                // rx_int下降沿標志位

  14. always @ (posedge clk or negedge rst_n) begin
  15.         if(!rst_n) begin
  16.                         rx_int0 <= 1'b0;
  17.                         rx_int1 <= 1'b0;
  18.                         rx_int2 <= 1'b0;
  19.                 end
  20.         else begin
  21.                         rx_int0 <= rx_int;
  22.                         rx_int1 <= rx_int0;
  23.                         rx_int2 <= rx_int1;
  24.                 end
  25. end

  26. assign pos_rx_int =  rx_int1 & ~rx_int2;        //捕捉到上升沿后,neg_rx_int拉地保持一個主時鐘周期

  27. //---------------------------------------------------------
  28. reg[7:0] tx_data;        //待發送數據的寄存器
  29. //---------------------------------------------------------
  30. reg bps_start_r;
  31. reg tx_en;        //發送數據使能信號,高有效
  32. reg[3:0] num;

  33. always @ (posedge clk or negedge rst_n) begin
  34.         if(!rst_n) begin
  35.                         bps_start_r <= 1'bz;
  36.                         tx_en <= 1'b0;
  37.                         tx_data <= 8'd0;
  38.                 end
  39.         else if(pos_rx_int) begin        //接收數據完畢,準備把接收到的數據發出去
  40.                         bps_start_r <= 1'b1;
  41.                         tx_data <= rx_data;        //把接收到的數據存入發送數據寄存器
  42.                         tx_en <= 1'b1;                //進入發送數據狀態中
  43.                 end
  44.         else if(num==4'd11) begin        //數據發送完成,復位
  45.                         bps_start_r <= 1'b0;
  46.                         tx_en <= 1'b0;
  47.                 end
  48. end

  49. assign bps_start = bps_start_r;

  50. //---------------------------------------------------------
  51. reg rs232_tx_r;

  52. always @ (posedge clk or negedge rst_n) begin
  53.         if(!rst_n) begin
  54.                         num <= 4'd0;
  55.                         rs232_tx_r <= 1'b1;
  56.                 end
  57.         else if(tx_en) begin
  58.                         if(clk_bps)        begin
  59.                                         num <= num+1'b1;
  60.                                         case (num)
  61.                                                 4'd0:        rs232_tx_r <= 1'b0;         //發送起始位
  62.                                                 4'd1:        rs232_tx_r <= tx_data[0];        //發送bit0
  63.                                                 4'd2:        rs232_tx_r <= tx_data[1];        //發送bit1
  64.                                                 4'd3: rs232_tx_r <= tx_data[2];        //發送bit2
  65.                                                 4'd4: rs232_tx_r <= tx_data[3];        //發送bit3
  66.                                                 4'd5: rs232_tx_r <= tx_data[4];        //發送bit4
  67.                                                 4'd6: rs232_tx_r <= tx_data[5];        //發送bit5
  68.                                                 4'd7:        rs232_tx_r <= tx_data[6];        //發送bit6
  69.                                                 4'd8: rs232_tx_r <= tx_data[7];        //發送bit7
  70.                                                 4'd9: rs232_tx_r <= 1'b1;        //發送結束位
  71.                                                  default: rs232_tx_r <= 1'b1;
  72.                                                 endcase
  73.                                 end
  74.                         else if(num==4'd11) num <= 4'd0;        //復位
  75.                 end
  76. end

  77. assign rs232_tx = rs232_tx_r;

  78. endmodule

  79. `timescale 1ns / 1ps
  80. module ps2_key(clk,rst_n,ps2k_clk,ps2k_data,rs232_tx);

  81. input clk;                        //50M時鐘信號
  82. input rst_n;                //復位信號
  83. input ps2k_clk;                //PS2接口時鐘信號
  84. input ps2k_data;        //PS2接口數據信號
  85. output rs232_tx;        // RS232發送數據信號


  86. wire[7:0] ps2_byte;        // 1byte鍵值
  87. wire ps2_state;                //按鍵狀態標志位

  88. wire bps_start;                //接收到數據后,波特率時鐘啟動信號置位
  89. wire clk_bps;                // clk_bps的高電平為接收或者發送數據位的中間采樣點

  90. ps2scan                        ps2scan(        .clk(clk),                                  //按鍵掃描模塊
  91.                                                                 .rst_n(rst_n),                               
  92.                                                                 .ps2k_clk(ps2k_clk),
  93.                                                                 .ps2k_data(ps2k_data),
  94.                                                                 .ps2_byte(ps2_byte),
  95.                                                                 .ps2_state(ps2_state)
  96.                                                                 );

  97. speed_select        speed_select(        .clk(clk),
  98.                                                                                 .rst_n(rst_n),
  99.                                                                                 .bps_start(bps_start),
  100.                                                                                 .clk_bps(clk_bps)
  101.                                                                                 );

  102. my_uart_tx                my_uart_tx(                .clk(clk),
  103.                                                                                 .rst_n(rst_n),
  104.                                                                                 .clk_bps(clk_bps),
  105.                                                                                 .rx_data(ps2_byte),
  106.                                                                                 .rx_int(ps2_state),
  107.                                                                                 .rs232_tx(rs232_tx),
  108.                                                                                 .bps_start(bps_start)
  109.                                                                                 );

  110. endmodule

  111. `timescale 1ns / 1ps
  112. module ps2scan(clk,rst_n,ps2k_clk,ps2k_data,ps2_byte,ps2_state);

  113. input clk;                //50M時鐘信號
  114. input rst_n;        //復位信號
  115. input ps2k_clk;        //PS2接口時鐘信號
  116. input ps2k_data;                //PS2接口數據信號
  117. output[7:0] ps2_byte;        // 1byte鍵值,只做簡單的按鍵掃描
  118. output ps2_state;                //鍵盤當前狀態,ps2_state=1表示有鍵被按下

  119. //------------------------------------------
  120. reg ps2k_clk_r0,ps2k_clk_r1,ps2k_clk_r2;        //ps2k_clk狀態寄存器

  121. //wire pos_ps2k_clk;         // ps2k_clk上升沿標志位
  122. wire neg_ps2k_clk;        // ps2k_clk下降沿標志位

  123. …………
  124. …………
  125. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

完整的Word格式文檔51黑下載地址(共54頁):
特權同學-深入淺出玩轉FPGA源代碼.docx (46.16 KB, 下載次數: 56)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:267435 發表于 2025-2-27 13:33 | 只看該作者
正在找特權同學資料
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91视频大全 | 日韩在线观看一区 | 国产在线资源 | 亚洲一区二区在线视频 | 国产在线精品一区二区 | 久久精品小视频 | 综合色在线| 欧美日韩国产一区二区三区 | 亚洲欧美综合精品久久成人 | 日韩欧美一区二区三区免费看 | 色就干 | 久久综合国产精品 | 亚洲精品国产电影 | 日本aaaa| 99综合| 国产精品久久亚洲7777 | 99热精品在线 | 久久国产一区二区三区 | 嫩草懂你的影院入口 | 国产精品99久久久久久久久 | 黄色免费在线网址 | 91中文字幕在线观看 | 美美女高清毛片视频免费观看 | 瑞克和莫蒂第五季在线观看 | 亚洲一区二区三区在线 | 不卡视频一区二区三区 | 亚洲视频二区 | 偷拍亚洲色图 | 欧美成人a| 国产精品久久久久久久久久 | 久久久久久中文字幕 | 福利视频网站 | 刘亦菲国产毛片bd | 羞羞视频网页 | 天天操天天玩 | 亚洲一区二区三区桃乃木香奈 | 日本高清视频在线播放 | 羞羞视频在线免费 | 国产精品一区二区日韩 | 久久国 | 亚洲在线一区二区三区 |