找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4013|回复: 0
打印 上一主题 下一主题
收起左侧

特权同学深入浅出玩转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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表