当前位置:   article > 正文

我的FPGA

我的FPGA

1.安装quartus

2.更新usb blaster驱动

3.新建工程

1.随便找一个文件夹,里面新建demo文件夹,表示一个个工程

在demo文件夹里面,新建src(源码),prj(项目),doc(文档)

2.进去quartus里面,点击new project

 

下面是你的fpga开发板的配置,包括Pin count,Core speed grade 

打开工程

"D:\Desktop\fpga\demo2\prj\demo2.qsf"

4.在src文件夹下写.v文件

  1. // demo.v
  2. module demo (
  3. // 不写类型,默认wire型
  4. input clk,
  5. output led
  6. );
  7. // 让led是高电平工作
  8. assign led=1;
  9. endmodule

5.启动文件

找寻.v文件

开始编译 

绑定led和引脚

重新编译

点击Device and Pin Options

 

点击Hardware Setup ,换成usb blaster

 点击start启动

5.Verilog语法

常量说明:每一个变量的值就是0或者1

变量定义:

        wire:在module中input和output后的变量默认是wire型

        rag:如果在always中,才会使用rag

连续赋值:

        assign:(主要用于组合逻辑电路)

        always:(主要用于时序逻辑电路)

6.实例

启动一个灯

  1. module demo (
  2. input clk,
  3. output led
  4. );
  5. assign led=1;
  6. endmodule

启动多个灯

  1. module demo (
  2. input clk,
  3. output [3:0] led
  4. );
  5. assign led=4'b1010;
  6. endmodule

流水灯

  1. /*
  2. assign,always都是同时进行的
  3. */
  4. module demo (
  5. input clk,
  6. input rst_n, // 复位
  7. output reg [3:0] led
  8. );
  9. // 开始
  10. wire add_cnt_500ms;
  11. assign add_cnt_500ms=1'b1;
  12. // 结束
  13. wire end_cnt_500ms;
  14. reg [24:0] cnt_500ms;
  15. assign end_cnt_500ms=add_cnt_500ms&&(cnt_500ms==25_000_000-1);
  16. // 计数
  17. always @(posedge clk or negedge rst_n) begin
  18. // 刚开始才会执行该if
  19. if(!rst_n)begin
  20. cnt_500ms<=0;
  21. end
  22. else if(add_cnt_500ms)begin
  23. if(end_cnt_500ms)begin
  24. cnt_500ms<=0;
  25. end
  26. else begin
  27. cnt_500ms<=cnt_500ms+1;
  28. end
  29. end
  30. end
  31. // 跳灯(移位实现)
  32. // always @(posedge clk or negedge rst_n) begin
  33. // if(!rst_n) begin
  34. // led=4'b1000
  35. // end
  36. // else if(led==4'b0001)begin
  37. // led<=4'b1000
  38. // end
  39. // else if(end_cnt_500ms) begin
  40. // led<=(led>>1)
  41. // end
  42. // end
  43. // 挑灯(拼接实现)
  44. always @(posedge clk or negedge rst_n) begin
  45. if(!rst_n)begin
  46. led<=4'b1000;
  47. end
  48. else if(end_cnt_500ms)begin
  49. led<={led[0],led[3:1]};
  50. end
  51. end
  52. endmodule

使用蜂鸣灯演奏两只老虎

  1. module music(
  2. input clk,
  3. input rst_n,
  4. output reg buzzer
  5. );
  6. //****************************************************//
  7. //计数器1产生音符
  8. //!开始条件
  9. wire add_cnt_get;
  10. assign add_cnt_get = 1'b1;
  11. //!结束条件
  12. wire end_cnt_get;
  13. reg [17:0] cnt_get;//满足最大值25_000_000
  14. reg [17:0] CNT_MAX;
  15. assign end_cnt_get = add_cnt_get && (cnt_get == CNT_MAX - 1);
  16. //!正常计数
  17. always @(posedge clk or negedge rst_n)begin
  18. if(!rst_n)begin
  19. cnt_get <= 0;//时序逻辑用非阻塞
  20. end
  21. else if(add_cnt_get)begin
  22. if(end_cnt_get)begin//情况少的:清零
  23. cnt_get <= 0;
  24. end
  25. else begin//情况多的:正常+1
  26. cnt_get <= cnt_get + 1;
  27. end
  28. end
  29. end
  30. //****************************************************//
  31. //计数器2音符
  32. //!开始条件
  33. wire add_cnt_repeat;
  34. assign add_cnt_repeat = end_cnt_get;
  35. //!结束条件
  36. wire end_cnt_repeat;
  37. reg [7:0] cnt_repeat;//满足最大值200
  38. // wire [17:0] CNT_MAX;
  39. assign end_cnt_repeat = add_cnt_repeat && (cnt_repeat == 200 - 1);
  40. //!正常计数
  41. always @(posedge clk or negedge rst_n)begin
  42. if(!rst_n)begin
  43. cnt_repeat <= 0;//时序逻辑用非阻塞
  44. end
  45. else if(add_cnt_repeat)begin
  46. if(end_cnt_repeat)begin//情况少的:清零
  47. cnt_repeat <= 0;
  48. end
  49. else begin//情况多的:正常+1
  50. cnt_repeat <= cnt_repeat + 1;
  51. end
  52. end
  53. end
  54. //****************************************************//
  55. //计数器3切换音符
  56. //!开始条件
  57. wire add_cnt_change;
  58. assign add_cnt_change = end_cnt_repeat;
  59. //!结束条件
  60. wire end_cnt_change;
  61. reg [5:0] cnt_change;//满足最大值48
  62. // wire [17:0] CNT_MAX;
  63. assign end_cnt_change = add_cnt_change && (cnt_change == 48 - 1);
  64. //!正常计数
  65. always @(posedge clk or negedge rst_n)begin
  66. if(!rst_n)begin
  67. cnt_change <= 0;//时序逻辑用非阻塞
  68. end
  69. else if(add_cnt_change)begin
  70. if(end_cnt_change)begin//情况少的:清零
  71. cnt_change <= 0;
  72. end
  73. else begin//情况多的:正常+1
  74. cnt_change <= cnt_change + 1;
  75. end
  76. end
  77. end
  78. parameter
  79. M_1Do = 95600,
  80. M_2Re = 85150,
  81. M_3Mi = 75850,
  82. M_4Fa = 71600,
  83. M_5So = 63750,
  84. M_6La = 56800,
  85. L_5So = 127550;
  86. always @(*) begin
  87. case (cnt_change)
  88. 6'd0 : CNT_MAX = M_1Do;
  89. 6'd1 : CNT_MAX = M_2Re;
  90. 6'd2 : CNT_MAX = M_3Mi;
  91. 6'd3 : CNT_MAX = M_1Do;
  92. 6'd4 : CNT_MAX = M_2Re;
  93. 6'd5 : CNT_MAX = M_3Mi;
  94. 6'd6 : CNT_MAX = M_1Do;
  95. 6'd7 : CNT_MAX = M_3Mi;
  96. 6'd8 : CNT_MAX = M_4Fa;
  97. 6'd9 : CNT_MAX = M_5So;
  98. 6'd10 :CNT_MAX = M_5So;
  99. 6'd11 :CNT_MAX = M_3Mi;
  100. 6'd12 :CNT_MAX = M_4Fa;
  101. 6'd13 :CNT_MAX = M_5So;
  102. 6'd14 :CNT_MAX = M_5So;
  103. 6'd15 :CNT_MAX = M_5So;
  104. 6'd16 :CNT_MAX = M_6La;
  105. 6'd17 :CNT_MAX = M_5So;
  106. 6'd18 :CNT_MAX = M_4Fa;
  107. 6'd19 :CNT_MAX = M_3Mi;
  108. 6'd20 :CNT_MAX = M_3Mi;
  109. 6'd21 :CNT_MAX = M_1Do;
  110. 6'd22 :CNT_MAX = M_1Do;
  111. 6'd23 :CNT_MAX = M_5So;
  112. 6'd24 :CNT_MAX = M_6La;
  113. 6'd25 :CNT_MAX = M_5So;
  114. 6'd26 :CNT_MAX = M_4Fa;
  115. 6'd27 :CNT_MAX = M_3Mi;
  116. 6'd28 :CNT_MAX = M_3Mi;
  117. 6'd29 :CNT_MAX = M_1Do;
  118. 6'd30 :CNT_MAX = M_1Do;
  119. 6'd31 :CNT_MAX = M_2Re;
  120. 6'd32 :CNT_MAX = M_2Re;
  121. 6'd33 :CNT_MAX = L_5So;
  122. 6'd34 :CNT_MAX = L_5So;
  123. 6'd35 :CNT_MAX = M_1Do;
  124. 6'd36 :CNT_MAX = M_1Do;
  125. 6'd37 :CNT_MAX = 1;
  126. 6'd38 :CNT_MAX = 1;
  127. 6'd39 :CNT_MAX = M_2Re;
  128. 6'd40 :CNT_MAX = M_2Re;
  129. 6'd41 :CNT_MAX = L_5So;
  130. 6'd42 :CNT_MAX = L_5So;
  131. 6'd43 :CNT_MAX = M_1Do;
  132. 6'd44 :CNT_MAX = M_1Do;
  133. 6'd45 :CNT_MAX = 1;
  134. 6'd46 :CNT_MAX = 1;
  135. 6'd47 :CNT_MAX = 1;
  136. default: ;//空语句
  137. endcase
  138. end
  139. //描述输出的信号
  140. always @(posedge clk or negedge rst_n) begin
  141. if(!rst_n) begin
  142. buzzer <= 1;
  143. end
  144. else if(cnt_get > (CNT_MAX >> 1))begin
  145. buzzer <= 0;
  146. end
  147. else begin
  148. buzzer <= 1;
  149. end
  150. end
  151. endmodule

引脚绑定

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/825235
推荐阅读
相关标签
  

闽ICP备14008679号