• 数电课程设计


    为了帮助大家更好学习FPGA硬件语言,创立此资源

    包含文件有:实验报告、仿真文件,资料很全,有问题可以私信

    课设一:加减计数器

    一、实验内容

    1、利用QuartusII和Modelsim实现100进制可逆计数器编码显示实验。

    二、实验步骤

    (1)安装软件

        事先安装好QuartusII和Modelsim两个软件。

    (2)创建工程

    (3)编写代码

    编写的.v顶层文件:

    1. module counter_1(
    2.     input clk,
    3.     input rst,
    4.     input flag,
    5.     output out_c
    6. );
    7. reg [9:0] count;
    8. always@(posedge clk or negedge rst)begin
    9. if(!rst)begin
    10.        count <= 0;                 //复位
    11. end
    12. else if(flag==1)begin
    13.       if(count<99)
    14.        count <= count + 1;     //flag为1,是加法计数器
    15.       else
    16.        count <= 0;              //计到99复位
    17. end
    18. else begin
    19.       if(count==0)
    20.        count <= 99;             //计到0复位
    21.       else
    22.        count <= count - 1;     //flag为0,是减法计数器
    23. end
    24. end
    25. endmodule
    26. 编写的textbench文件:
    27. `timescale 1 ns/ 1 ps
    28. module counter_tb();
    29. // constants                                          
    30. // general purpose registers
    31. // test vector input registers
    32. reg clk;
    33. reg flag;
    34. reg rst;
    35. // wires                                              
    36. wire out_c;
    37. // assign statements (if any)                         
    38. counter_1 i1 (
    39. // port map - connection between master ports and signals/registers  
    40.     .clk(clk),
    41.     .flag(flag),
    42.     .out_c(out_c),
    43.     .rst(rst)
    44. );
    45. initial                                               
    46. begin                                                 
    47. // code that executes only once                       
    48. // insert code here --> begin                          
    49.     clk = 0;
    50.     rst = 0;
    51.     #100 rst = 1;
    52.     flag = 1;
    53.     #1000 flag =0;        //初始化
    54.    
    55. // --> end                                                                 
    56. end                                                   
    57. always #5000 flag = ~flag;       //每5000ns之后flag翻转
    58. always #10 clk = ~clk;           //时钟周期20ns                                   
    59. endmodule

    三、实验结果

    课设二:交通信号灯

    一、实验内容

    (1)十字路口有 x、y 方向两组交通信号灯,每组有红、黄、绿灯各一个;

    (2)设计一个交通灯控制电路,模拟十字路口交通灯工作情况,红灯亮 35s,黄灯亮 5s,绿 灯亮 30s;

    (3)设系统时钟频率为 50MHz,要求用数码管显示计时结果;

    (4)掌握 Verilog HDL 的状态机编程,红、黄、绿灯点亮转换用如下的状态转换图实现。

    二、实验步骤

    (1)编写代码

    编写的.v顶层文件:

      1. 1. module traffic(
      2. 2. input clk,
      3. 3. input rst,
      4. 4.
      5. 5. output reg LEDR_Y,
      6. 6. output reg LEDY_Y,
      7. 7. output reg LEDG_Y,
      8. 8. output reg LEDR_X,
      9. 9. output reg LEDY_X,
      10. 10. output reg LEDG_X
      11. 11.
      12. 12. );
      13. 13. parameter N = 25000000;
      14. 14. parameter S1 = 0;
      15. 15. parameter S2 = 1;
      16. 16. parameter S3 = 2;
      17. 17. parameter S4 = 3;
      18. 18. reg [25:0] count;
      19. 19. reg CLK_1Hz;
      20. 20. reg [2:0] cnt5;
      21. 21. reg [4:0] cnt30;
      22. 22. reg [1:0]state;//状态
      23. 23.
      24. 24. //生成1Hz时钟
      25. 25. always@(posedge clk or negedge rst)begin
      26. 26. if(!rst)begin
      27. 27. count <= 0;
      28. 28. CLK_1Hz <= 0;
      29. 29. end
      30. 30. else if(count-1)begin
      31. 31. count <= count +1;
      32. 32. CLK_1Hz <= CLK_1Hz;
      33. 33. end
      34. 34. else begin
      35. 35. count <= 0;
      36. 36. CLK_1Hz <= ~CLK_1Hz;
      37. 37. end
      38. 38. end
      39. 39.
      40. 40. //生成5进制计数器
      41. 41. always@(posedge CLK_1Hz or negedge rst)begin
      42. 42. if(!rst)begin
      43. 43. cnt5 <= 0;
      44. 44. end
      45. 45. else if(cnt5<4)begin
      46. 46. cnt5 <= cnt5 + 1;
      47. 47. end
      48. 48. else
      49. 49. cnt5 <= 0;
      50. 50. end
      51. 51.
      52. 52. //生成30进制计数器
      53. 53. always@(posedge CLK_1Hz or negedge rst)begin
      54. 54. if(!rst)begin
      55. 55. cnt30 <= 0;
      56. 56. end
      57. 57. else if(cnt30 < 29)begin
      58. 58. cnt30 <= cnt30 + 1;
      59. 59. end
      60. 60. else
      61. 61. cnt30 <= 0;
      62. 62. end
      63. 63.
      64. 64. //状态迁移
      65. 65. always@(posedge clk or negedge rst)begin
      66. 66. if(!rst)begin
      67. 67. state <= 0;
      68. 68. end
      69. 69. else begin
      70. 70. case(state)
      71. 71.
      72. 72. S1:
      73. 73. if(cnt30==29) state <= S3;
      74. 74. else state <= S1;
      75. 75. S2:
      76. 76. if(cnt30==29) state <= S4;
      77. 77. else state <= S2;
      78. 78. S3:
      79. 79. if(cnt5==4) state <= S2;
      80. 80. else state <= S3;
      81. 81. S4:
      82. 82. if(cnt5==4) state <= S1;
      83. 83. else state <= S4;
      84. 84. default: state <= S1;
      85. 85. endcase
      86. 86. end
      87. 87. end
      88. 88.
      89. 89. //状态
      90. 90. always@(posedge clk or negedge rst)begin
      91. 91. if(!rst)begin //刚开始全灭
      92. 92. LEDR_Y <= 0;
      93. 93. LEDY_Y <= 0;
      94. 94. LEDG_Y <= 0;
      95. 95. LEDR_X <= 0;
      96. 96. LEDY_X <= 0;
      97. 97. LEDG_X <= 0;
      98. 98. end
      99. 99. else begin
      100. 100. case(state)
      101. 101. S1: begin //Y方向绿灯亮,X方向红灯亮
      102. 102. LEDR_Y <= 0;
      103. 103. LEDY_Y <= 0;
      104. 104. LEDG_Y <= 1;
      105. 105. LEDR_X <= 1;
      106. 106. LEDY_X <= 0;
      107. 107. LEDG_X <= 0;
      108. 108. end
      109. 109. S2: begin //X方向绿灯亮,Y方向红灯亮
      110. 110. LEDR_Y <= 1;
      111. 111. LEDY_Y <= 0;
      112. 112. LEDG_Y <= 0;
      113. 113. LEDR_X <= 0;
      114. 114. LEDY_X <= 0;
      115. 115. LEDG_X <= 1;
      116. 116. end
      117. 117. S3: begin //X方向红灯亮,Y方向黄灯亮
      118. 118. LEDR_Y <= 0;
      119. 119. LEDY_Y <= 1;
      120. 120. LEDG_Y <= 0;
      121. 121. LEDR_X <= 1;
      122. 122. LEDY_X <= 0;
      123. 123. LEDG_X <= 0;
      124. 124. end
      125. 125. S4: begin //X方向黄灯亮,Y方向红灯亮
      126. 126. LEDR_Y <= 1;
      127. 127. LEDY_Y <= 0;
      128. 128. LEDG_Y <= 0;
      129. 129. LEDR_X <= 0;
      130. 130. LEDY_X <= 1;
      131. 131. LEDG_X <= 0;
      132. 132. end
      133. 133. default: begin //全灭
      134. 134. LEDR_Y <= 0;
      135. 135. LEDY_Y <= 0;
      136. 136. LEDG_Y <= 0;
      137. 137. LEDR_X <= 0;
      138. 138. LEDY_X <= 0;
      139. 139. LEDG_X <= 0;
      140. 140. end
      141. 141. endcase
      142. 142. end
      143. 143.
      144. 144. end
      145. 145.
      146. 146. endmodule
      147. 编写的textbench文件:
      148. 1. `timescale 1 ns/ 1 ps
      149. 2. module traffic_tb();
      150. 3. // constants
      151. 4. // general purpose registers
      152. 5.
      153. 6. reg clk;
      154. 7. reg rst;
      155. 8. // wires
      156. 9. wire LEDG_X;
      157. 10. wire LEDG_Y;
      158. 11. wire LEDR_X;
      159. 12. wire LEDR_Y;
      160. 13. wire LEDY_X;
      161. 14. wire LEDY_Y;
      162. 15.
      163. 16. // assign statements (if any)
      164. 17. traffic i1 (
      165. 18. // port map - connection between master ports and signals/registers
      166. 19. .LEDG_X(LEDG_X),
      167. 20. .LEDG_Y(LEDG_Y),
      168. 21. .LEDR_X(LEDR_X),
      169. 22. .LEDR_Y(LEDR_Y),
      170. 23. .LEDY_X(LEDY_X),
      171. 24. .LEDY_Y(LEDY_Y),
      172. 25. .clk(clk),
      173. 26. .rst(rst)
      174. 27. );
      175. 28. initial
      176. 29. begin
      177. 30. clk = 0;
      178. 31. rst = 0;
      179. 32. #100 rst = 1;
      180. 33.
      181. 34. end
      182. 35.
      183. 36. always #10 clk <= ~clk;
      184. 37.
      185. 38. endmodule

    编写的textbench文件:

    1. `timescale 1 ns/ 1 ps  
    2. module traffic_tb();  
    3. // constants                                             
    4. // general purpose registers  
    5.   
    6. reg clk;  
    7. reg rst;  
    8. // wires                                                 
    9. wire LEDG_X;  
    10. wire LEDG_Y;  
    11. wire LEDR_X;  
    12. wire LEDR_Y;  
    13. wire LEDY_X;  
    14. wire LEDY_Y;  
    15.   
    16. // assign statements (if any)                            
    17. traffic i1 (  
    18. // port map - connection between master ports and signals/registers     
    19.     .LEDG_X(LEDG_X),  
    20.     .LEDG_Y(LEDG_Y),  
    21.     .LEDR_X(LEDR_X),  
    22.     .LEDR_Y(LEDR_Y),  
    23.     .LEDY_X(LEDY_X),  
    24.     .LEDY_Y(LEDY_Y),  
    25.     .clk(clk),  
    26.     .rst(rst)  
    27. );  
    28. initial                                                  
    29. begin                                                    
    30.      clk = 0;  
    31.       rst = 0;  
    32.       #100 rst = 1;  
    33.                        
    34. end    
    35.                                                     
    36. always   #10 clk <= ~clk;                                                
    37.                                               
    38. endmodule  

    三、实验结果

    S1到S3的转换:

    S3到S2的转换:

    S2到S4的转换:

    S4到S1的转换:

    课设三:波形发生器

    一、实验内容

    1、仿真实验:正弦信号发生器,学习IP核的使用;

    2、拓展要求:三角波信号发生器,熟悉仿真、状态机的使用。

    • 实验步骤

        跳过创建工程的过程。

    (1)编写正弦波仿真实验代码

    首先我们生成正弦波是提前把正弦波的数据保存在ROM文件(.mif)文件中,然后通过调用ROM的IP核,最后通过读取ROM的数据输出正弦波数据。

    创建单端ROM的IP核。

    设置ROM的位宽和长度。这里是8位64个信号

    添加.mif文件

    编写的.v顶层文件:

    1. module waveform(
    2. input clk,
    3. input rst,
    4. output [7:0]data_out,
    5. output reg [6:0]data_tri
    6. );
    7. parameter S1 = 0;
    8. parameter S2 = 1;
    9. reg [5:0]addr;
    10. reg [1:0]state;
    11. reg [1:0]next_state;
    12. always@(posedge clk or negedge rst)begin
    13. if(!rst)
    14. addr <= 0;
    15. else
    16. addr <= addr + 1;
    17. end
    18. sinROM U1(
    19. .address(addr),
    20. .clock(clk),
    21. .q(data_out));
    22. endmodule

    (2)编写三角波发生器仿真实验代码

    编写的状态机源码:

    1. //状态迁移
    2. always@(posedge clk or negedge rst)begin
    3. if(!rst)
    4. state <= S1;
    5. else
    6. state <= next_state;
    7. end
    8. //状态事件
    9. always@(posedge clk or negedge rst)begin
    10. if(!rst)
    11. next_state <= 0;
    12. else begin
    13. case(state)
    14. S1: begin
    15. if(data_tri >= 98)
    16. next_state <= S2;
    17. else
    18. next_state <= state;
    19. end
    20. S2: begin
    21. if(data_tri <= 2)
    22. next_state <= S1;
    23. else
    24. next_state <= state;
    25. end
    26. default: next_state <= S1;
    27. endcase
    28. end
    29. end
    30. always@(posedge clk or negedge rst)begin
    31. if(!rst)begin
    32. data_tri <= 0;
    33. end
    34. else begin
    35. case(state)
    36. S1 : data_tri <= data_tri + 1;
    37. S2 : data_tri <= data_tri - 1;
    38. default: data_tri <= 0;
    39. endcase
    40. end
    41. end

    编写的测试文件:

    1. `timescale 1 ns/ 1 ps
    2. module waveform_tb();
    3. // constants
    4. // general purpose registers
    5. // test vector input registers
    6. reg clk;
    7. reg rst;
    8. // wires
    9. wire [7:0] data_out;
    10. wire [6:0] data_tri;
    11. // assign statements (if any)
    12. waveform i1 (
    13. // port map - connection between master ports and signals/registers
    14. .clk(clk),
    15. .data_out(data_out),
    16. .data_tri(data_tri),
    17. .rst(rst)
    18. );
    19. initial
    20. begin
    21. clk = 0;
    22. rst = 0;
    23. #100 rst = 1;
    24. end
    25. always #10 clk <= ~clk;
    26. // optional sensitivity list
    27. // @(event1 or event2 or .... eventn)
    28. endmodule

    三、实验结果

    正弦波波形:

    三角波波形:

    注意事项:在正弦波形的仿真过程中遇到过读取ROM的数一直为零的情况,后来查询发现是因为.mif文件与工程不在同一目录。

    本文大部分内容都属于原创,如需转载,请附上本文网站,
    如果需要相关的仿真图、程序代码等资料可以直接私信我,我会及时回复。

  • 相关阅读:
    最新SparkAI创作系统V2.6.2/ChatGPT网站系统H5源码+微信公众号版+AI绘画系统源码/支持GPT联网提问/支持Prompt应用
    使用Langchain+GPT+向量数据库chromadb 来创建文档对话机器人
    OSI与TCP/IP与的体系结构的比较
    macOS Monterey12.5.1 配置vim
    使用pyQt5和matplotlib绘制图表
    shiro授权-SSM
    经验,真的是你的核心竞争力吗?
    优秀智慧园区案例 - 上海世博文化公园智慧园区,先进智慧园区建设方案经验
    Macbooster8免费mac清理垃圾软件功能介绍
    每日学习笔记:C++ STL 的forward_list
  • 原文地址:https://blog.csdn.net/wqsdqw/article/details/132788984