当前位置:   article > 正文

基于FPGA的updata大综合设计_flash擦除仿真结果

flash擦除仿真结果

1.原理图,这次的协议是7*55/d5/aa(擦出flash)55(在flash中写入数据)。因此frame的控制模块至关重要。

2.仿真结果

   这是仿真的frame控制模过滤协议之后产生的擦除地址与标志位,图中可以看出能够产生。

    这是flash的擦除模块,这是flash模块中的扇区自动加一,这次擦除了8个扇区。

     这是擦除完成的标志位,回传55表示擦除完成。

        这是仿真在协议模块中过滤协议之后,产生写的地址、写地址标志位、写数据以及写数据的标志位。

          通过观察flash的写控制模块可以发现flash可以写入相应的数据。

    通过观察uart的tx模块端,结束标志位产生后,可以回传aa(16进制)

3.这次大综合需要用到的模块uart的rx模块和tx模块、flash的擦除模块和写入模块、按键消抖和icapIP核模块以及利用top模块将所有模块综合。

  1. module rx_crtl(
  2. input wire sclk,
  3. input wire rst_n,
  4. input wire rx_in,
  5. output reg stop_flag, //新增数据监测停止位
  6. output reg flag_o,
  7. output reg [7:0] data_o
  8. );
  9. reg [12:0] cnt;
  10. reg [3:0] bit_cnt;
  11. reg rx_in_1,rx_in_2;
  12. reg rx_en; //使能信号值有问题
  13. reg bit_flag;
  14. reg [7:0]tmp_data;
  15. reg tmp_flag;
  16. reg [16:0] cnt_clean;
  17. parameter CNT_CLEAN=100000;//28888; 仿真多写14
  18. parameter CNT=5207;
  19. parameter BIT_CNT=8;
  20. parameter bit_flag_cnt=2603; // 产生bit采集标志位
  21. //parameter clean_flag=2610;
  22. always@(posedge sclk or negedge rst_n) //ram输入信号清零计数器
  23. if(!rst_n)
  24. cnt_clean<=16'd0;
  25. else if(flag_o==1'b1) // 少写了清零条件,导致写地址一直处于清零状态
  26. cnt_clean<=16'd0;
  27. else if(cnt_clean==CNT_CLEAN)
  28. cnt_clean<=cnt_clean; // 优先级,当时产生清零标志位没有保持,而是清零导致产生无数个终端位
  29. else if(flag_o==1'b0) //flag_o==1'b1,当时想的就是拉高开始计数,结果发现根本不计数
  30. cnt_clean<=cnt_clean+1'b1; //因为标志位拉高只有一个时钟周期,应该记拉低的时钟周期。
  31. always@(posedge sclk or negedge rst_n) //数据清零位传递给帧协议
  32. if(!rst_n)
  33. stop_flag<=1'b0;
  34. else if (cnt_clean==CNT_CLEAN-1)
  35. stop_flag<=1'b1;
  36. else stop_flag<=1'b0;
  37. always@(posedge sclk or negedge rst_n)
  38. if(!rst_n)
  39. rx_in_1<=1'b1;
  40. else rx_in_1<=rx_in;
  41. always@(posedge sclk or negedge rst_n) //输入信号延时
  42. if(!rst_n)
  43. rx_in_2<=1'b1;
  44. else rx_in_2<=rx_in_1;
  45. always@(posedge sclk or negedge rst_n) //产生计数使能信号
  46. if(!rst_n)
  47. rx_en<=1'b0;
  48. else if(rx_in_1==1'b0&&rx_in_2==1'b1)
  49. rx_en<=1'b1;
  50. else if(bit_cnt==BIT_CNT&&cnt==CNT)
  51. rx_en<=1'b0;
  52. always@(posedge sclk or negedge rst_n)
  53. if(!rst_n)
  54. cnt<=13'd0;
  55. else if(rx_en==1'b0)
  56. cnt<=13'd0;
  57. else if(cnt==CNT)
  58. cnt<=13'd0;
  59. else if(rx_en==1'b1)
  60. cnt<=cnt+1'b1;
  61. always@(posedge sclk or negedge rst_n) //位宽计数
  62. if(!rst_n)
  63. bit_cnt<=4'd0;
  64. else if(rx_en==1'b0)
  65. bit_cnt<=4'd0;
  66. else if(bit_cnt==BIT_CNT&&cnt==CNT)
  67. bit_cnt<=4'd0;
  68. else if(cnt==CNT)
  69. bit_cnt<=bit_cnt+1'b1;
  70. always@(posedge sclk or negedge rst_n) //产生bit标志位
  71. if(!rst_n)
  72. bit_flag<=1'b0;
  73. else if(cnt==bit_flag_cnt)
  74. bit_flag<=1'b1;
  75. else bit_flag<=1'b0;
  76. always@(posedge sclk or negedge rst_n) //数据拼接
  77. if(!rst_n)
  78. tmp_data<=8'd0;
  79. else if(bit_flag==1'b1&&bit_cnt>=4'd1&&bit_cnt<=4'd8)
  80. tmp_data<={rx_in_2,tmp_data[7:1]}; //少写分号
  81. //else if(bit_cnt==BIT_CNT&&cnt==clean_flag) 数据不清零条件
  82. // tmp_data<=8'd0;
  83. always@(posedge sclk or negedge rst_n) //数据拼接完成标志
  84. if(!rst_n)
  85. tmp_flag<=1'b0;
  86. else if(bit_flag==1'b1&&bit_cnt==BIT_CNT)
  87. tmp_flag<=1'b1;
  88. else tmp_flag<=1'b0;
  89. always@(posedge sclk or negedge rst_n)
  90. if(!rst_n)
  91. data_o<=8'd0;
  92. else if(tmp_flag==1'b1)
  93. data_o<=tmp_data;
  94. always@(posedge sclk or negedge rst_n)
  95. if(!rst_n)
  96. flag_o<=1'b0;
  97. else flag_o<=tmp_flag;
  98. endmodule

 

  1. module w_farme(
  2. input wire sclk,
  3. input wire rst_n,
  4. input wire flag_uart,
  5. input wire [7:0] data_uart,
  6. input wire stop_flag, //数据发送完成标志
  7. input wire sen_stop_flag, //擦除完成标识
  8. output reg wr_flag,
  9. output reg [23:0] wr_addr,
  10. output reg [7:0] wr_data,
  11. output reg wr_flag_dizhi,
  12. output reg [23:0] se_addr,
  13. output reg se_flag,
  14. output reg tx_flag,
  15. output reg [7:0] tx_data //擦除结束用55标志,发生完成用aa标识
  16. );
  17. reg [10:0] state;
  18. parameter IDLE =11'b00000_0000_01;
  19. parameter H_1_55 =11'b00000_0000_10;
  20. parameter H_2_55 =11'b00000_0001_00;
  21. parameter H_3_55 =11'b00000_0010_00;
  22. parameter H_4_55 =11'b00000_0100_00;
  23. parameter H_5_55 =11'b00000_1000_00;
  24. parameter H_6_55 =11'b00001_0000_00;
  25. parameter H_7_55 =11'b00010_0000_00;
  26. parameter H_d5 =11'b00100_0000_00;
  27. parameter H_se =11'b01000_0000_00;
  28. parameter H_wr =11'b10000_0000_00;
  29. reg [2:0] cnt_flag;
  30. reg [23:0] tmp_addr;
  31. reg [2:0] cnt_flag_wr;
  32. reg [23:0] tmp_addr_wr;
  33. reg flag_uart_dely;
  34. reg flag_uart_dely1;
  35. always@(posedge sclk or negedge rst_n)
  36. if(!rst_n)
  37. state<=IDLE;
  38. //else if(stop_flag==1'b1)
  39. // state<=idle;
  40. else if(flag_uart==1'b1)
  41. case(state)
  42. IDLE : if(data_uart==8'h55)
  43. state<=H_1_55;
  44. else state<=IDLE;
  45. H_1_55: if(data_uart==8'h55)
  46. state<=H_2_55;
  47. else state<=IDLE;
  48. H_2_55: if(data_uart==8'h55)
  49. state<=H_3_55;
  50. else state<=IDLE;
  51. H_3_55: if(data_uart==8'h55)
  52. state<=H_4_55;
  53. else state<=IDLE;
  54. H_4_55: if(data_uart==8'h55)
  55. state<=H_5_55;
  56. else state<=IDLE;
  57. H_5_55: if(data_uart==8'h55)
  58. state<=H_6_55;
  59. else state<=IDLE;
  60. H_6_55: if(data_uart==8'h55)
  61. state<=H_7_55;
  62. else state<=IDLE;
  63. H_7_55: if(data_uart==8'hd5)
  64. state<=H_d5;
  65. else state<=IDLE;
  66. H_d5: if(data_uart==8'haa)
  67. state<=H_se;
  68. else if(data_uart==8'h55)
  69. state<=H_wr;
  70. else state<=IDLE;
  71. H_se: if(sen_stop_flag==1)
  72. state<=IDLE;
  73. else state<=state;
  74. H_wr: if(stop_flag==1)
  75. state<=IDLE;
  76. else state<=state;
  77. default:;
  78. endcase
  79. always@(posedge sclk or negedge rst_n)
  80. if(!rst_n)
  81. flag_uart_dely<=0;
  82. else flag_uart_dely<=flag_uart;
  83. always@(posedge sclk or negedge rst_n)
  84. if(!rst_n)
  85. flag_uart_dely1<=0;
  86. else flag_uart_dely1<=flag_uart_dely;
  87. always@(posedge sclk or negedge rst_n) //产生读计数器,对输入的标志位计数
  88. if(!rst_n)
  89. cnt_flag<=2'd0;
  90. else if(sen_stop_flag==1)
  91. cnt_flag<=2'd0;
  92. else if(cnt_flag==5)
  93. cnt_flag<=cnt_flag;
  94. else if(state==H_se&&flag_uart_dely==1)
  95. cnt_flag<=cnt_flag+1;
  96. always@(posedge sclk or negedge rst_n) //读地址拼接——目前不确定要不要清零
  97. if(!rst_n)
  98. tmp_addr<=24'd0;
  99. else if(state==H_se&&flag_uart==1&&cnt_flag<=3)
  100. tmp_addr<={tmp_addr[15:0],data_uart};
  101. always@(posedge sclk or negedge rst_n) //地址发送
  102. if(!rst_n)
  103. se_addr<=24'd0;
  104. else se_addr<=tmp_addr;
  105. always@(posedge sclk or negedge rst_n) //清除标志位产生
  106. if(!rst_n)
  107. se_flag<=0;
  108. else if(cnt_flag==4)
  109. se_flag<=flag_uart_dely1;
  110. else se_flag<=0;
  111. always@(posedge sclk or negedge rst_n) //产生写计数器,对输入的标志位计数
  112. if(!rst_n)
  113. cnt_flag_wr<=2'd0;
  114. else if(stop_flag==1)
  115. cnt_flag_wr<=2'd0;
  116. else if(cnt_flag_wr==5)
  117. cnt_flag_wr<=cnt_flag_wr;
  118. else if(state==H_wr&&flag_uart_dely==1)
  119. cnt_flag_wr<=cnt_flag_wr+1;
  120. always@(posedge sclk or negedge rst_n) //写地址拼接——目前不确定要不要清零wr_flag_dizhi
  121. if(!rst_n)
  122. tmp_addr_wr<=24'd0;
  123. else if(state==H_wr&&flag_uart==1&&cnt_flag_wr<=3)
  124. tmp_addr_wr<={tmp_addr_wr[15:0],data_uart};
  125. always@(posedge sclk or negedge rst_n) //写地址拼接——目前不确定要不要清零wr_flag_dizhi
  126. if(!rst_n)
  127. wr_flag_dizhi<=0;
  128. else if(cnt_flag_wr==4)
  129. wr_flag_dizhi<=flag_uart_dely;
  130. else wr_flag_dizhi<=0;
  131. always@(posedge sclk or negedge rst_n) //地址发送
  132. if(!rst_n)
  133. wr_addr<=24'd0;
  134. else wr_addr<=tmp_addr_wr;
  135. always@(posedge sclk or negedge rst_n) //数据发送标志位产生
  136. if(!rst_n)
  137. wr_flag<=0;
  138. else if(cnt_flag_wr>=5)
  139. wr_flag<=flag_uart_dely1;
  140. else wr_flag<=0;
  141. always@(posedge sclk or negedge rst_n) //写的数据打拍
  142. if(!rst_n)
  143. wr_data<=8'd0;
  144. else if(cnt_flag_wr==5)
  145. wr_data<=data_uart;
  146. else if(stop_flag==1)
  147. wr_data<=8'd0;
  148. always@(posedge sclk or negedge rst_n) //回传数据标志位
  149. if(!rst_n)
  150. tx_flag<=0;
  151. else if(sen_stop_flag==1)
  152. tx_flag<=1;
  153. else if(stop_flag==1&&state==H_wr)
  154. tx_flag<=1;
  155. else tx_flag<=0;
  156. always@(posedge sclk or negedge rst_n) //回传数据
  157. if(!rst_n)
  158. tx_data<=8'd0;
  159. else if(sen_stop_flag==1)
  160. tx_data<=8'h55;
  161. else if(stop_flag==1)
  162. tx_data<=8'haa;
  163. else tx_data<=8'd0;
  164. endmodule

 

  1. /***************************
  2. spi协议控制flash扇区擦除
  3. ****************************/
  4. module flash_ctrl_se(
  5. input wire sclk,
  6. input wire rst_n,
  7. input wire pi_se_flag,
  8. input wire [23:0] se_addr_in,
  9. output reg led,
  10. output reg cs_n,
  11. output reg sck,
  12. output reg sdi,
  13. output reg sent_flag_out //地址清零结束位
  14. );
  15. reg [9:0] state;
  16. parameter idle =10'b0000_0000_01;
  17. parameter WAIT1 =10'b0000_0000_10;
  18. parameter WRITE =10'b0000_0001_00;
  19. parameter WAIT2 =10'b0000_0010_00;
  20. parameter WAIT3 =10'b0000_0100_00;
  21. parameter WAIT4 =10'b0000_1000_00;
  22. parameter SE =10'b0001_0000_00;
  23. parameter INIT_ADDR =10'b0010_0000_00;
  24. parameter WAIT5 =10'b0100_0000_00;
  25. parameter WAIT_3S =10'b1000_0000_00;
  26. reg [4:0] sclk_cnt;
  27. parameter SCLK_CNT=31;
  28. reg [1:0] cnt_init_addr;
  29. reg [25:0] cnt_1s;
  30. parameter ONE_S=49_9999_99;
  31. reg [1:0] cnt_3s;
  32. reg [1:0] cnt4;
  33. reg [2:0] bit_cnt;
  34. reg [3:0] cnt_wait_3s;
  35. reg [23:0] init_addr;
  36. parameter wr_en=8'h06; //信号差了一个时钟周期
  37. parameter se_en=8'hd8;
  38. parameter CNT_wait_3s=7;
  39. reg cnt_3s_en;
  40. always@(posedge sclk or negedge rst_n) //循环擦除
  41. if(!rst_n)
  42. cnt_wait_3s<=3'd0;
  43. else if(cnt_wait_3s==CNT_wait_3s&&cnt_1s==ONE_S&&cnt_3s==2)
  44. cnt_wait_3s<=3'd0;
  45. else if(state==WAIT_3S&&cnt_1s==ONE_S&&cnt_3s==2)
  46. cnt_wait_3s<=cnt_wait_3s+1'b1;
  47. always@(posedge sclk or negedge rst_n) //扇区地址变换
  48. if(!rst_n)
  49. init_addr<=24'd0;
  50. else if(pi_se_flag==1)
  51. init_addr<=se_addr_in;
  52. else if(state==WAIT_3S&&cnt_1s==ONE_S&&cnt_3s==2) /
  53. init_addr<=init_addr+24'h01_0000;
  54. else if(state==idle)
  55. init_addr<=24'd0;
  56. always@(posedge sclk or negedge rst_n) //为输出时钟计数
  57. if(!rst_n)
  58. cnt4<=2'd0;
  59. else if(cnt4==3)
  60. cnt4<=2'd0;
  61. else if(state==WRITE||state==SE||state==INIT_ADDR)
  62. cnt4<=cnt4+1;
  63. always@(posedge sclk or negedge rst_n) // bit位计数
  64. if(!rst_n)
  65. bit_cnt<=3'd0;
  66. else if(bit_cnt==7&&cnt4==3)
  67. bit_cnt<=3'd0;
  68. else if(cnt4==3)
  69. bit_cnt<=bit_cnt+1;
  70. always@(posedge sclk or negedge rst_n)
  71. if(!rst_n)
  72. cnt_1s<=26'd0;
  73. else if(cnt_1s==ONE_S)
  74. cnt_1s<=26'd0;
  75. else if(cnt_3s_en==1)
  76. cnt_1s<=cnt_1s+1;
  77. always@(posedge sclk or negedge rst_n)
  78. if(!rst_n)
  79. cnt_3s<=2'd0;
  80. else if(cnt_1s==ONE_S&&cnt_3s==2)
  81. cnt_3s<=2'd0;
  82. else if(cnt_1s==ONE_S)
  83. cnt_3s<=cnt_3s+1;
  84. always@(posedge sclk or negedge rst_n) //3秒使能信号
  85. if(!rst_n)
  86. cnt_3s_en<=0;
  87. else if(cnt_1s==ONE_S&&cnt_3s==2)
  88. cnt_3s_en<=0;
  89. else if(state==WAIT_3S)
  90. cnt_3s_en<=1;
  91. always@(posedge sclk or negedge rst_n)
  92. if(!rst_n)
  93. cs_n<=1;
  94. else if(pi_se_flag==1)
  95. cs_n<=0;
  96. else if(state==idle)
  97. cs_n<=1;
  98. else if(state==WAIT2&&sclk_cnt==SCLK_CNT) //片选信号没有描述对
  99. cs_n<=1;
  100. else if(state==WAIT3&&sclk_cnt==SCLK_CNT)
  101. cs_n<=0;
  102. else if(state==WAIT5&&sclk_cnt==SCLK_CNT)
  103. cs_n<=1;
  104. else if(state==WAIT_3S&&cnt_1s==ONE_S&&cnt_3s==2)
  105. cs_n<=0;
  106. //else if(cnt_wait_3s==CNT_wait_3s)
  107. //cs_n<=1;
  108. always@(posedge sclk or negedge rst_n)
  109. if(!rst_n)
  110. sclk_cnt<=5'd0;
  111. else if (sclk_cnt==SCLK_CNT&&cnt_wait_3s==CNT_wait_3s)
  112. sclk_cnt<=5'd0;
  113. else if(sclk_cnt==SCLK_CNT)
  114. sclk_cnt<=5'd0;
  115. else if(cs_n==0)
  116. sclk_cnt<=sclk_cnt+1;
  117. else if(state==WAIT3)
  118. sclk_cnt<=sclk_cnt+1;
  119. always@(posedge sclk or negedge rst_n) //3位状态计数
  120. if(!rst_n)
  121. cnt_init_addr<=2'd0;
  122. else if(cnt_init_addr==2'd2&&sclk_cnt==SCLK_CNT)
  123. cnt_init_addr<=2'd0;
  124. else if(sclk_cnt==SCLK_CNT&&state==INIT_ADDR)
  125. cnt_init_addr<=cnt_init_addr+1;
  126. always@(posedge sclk or negedge rst_n)
  127. if(!rst_n)
  128. state<=idle;
  129. else case(state)
  130. idle: if(pi_se_flag==1)
  131. state<=WAIT1;
  132. else state<=idle;
  133. WAIT1: if(sclk_cnt==SCLK_CNT)
  134. state<=WRITE;
  135. else state<=WAIT1;
  136. WRITE: if(sclk_cnt==SCLK_CNT)
  137. state<=WAIT2;
  138. else state<=WRITE;
  139. WAIT2: if(sclk_cnt==SCLK_CNT)
  140. state<=WAIT3;
  141. else state<=WAIT2;
  142. WAIT3: if(sclk_cnt==SCLK_CNT)
  143. state<=WAIT4;
  144. else state<=WAIT3;
  145. WAIT4: if(sclk_cnt==SCLK_CNT)
  146. state<=SE;
  147. SE: if(sclk_cnt==SCLK_CNT)
  148. state<=INIT_ADDR;
  149. else state<=SE;
  150. INIT_ADDR: if(cnt_init_addr==2'd2&&sclk_cnt==SCLK_CNT)
  151. state<=WAIT5;
  152. else state<=INIT_ADDR;
  153. WAIT5: if(sclk_cnt==SCLK_CNT)
  154. state<=WAIT_3S;
  155. else state<=WAIT5;
  156. WAIT_3S: if(cnt_1s==ONE_S&&cnt_3s==2)
  157. state<=WAIT1;
  158. else if(cnt_wait_3s==CNT_wait_3s)
  159. state<=idle;
  160. default: state<=idle;
  161. endcase
  162. always@(posedge sclk or negedge rst_n) //时钟传递
  163. if(!rst_n)
  164. sck<=0;
  165. else if(state==WRITE &&cnt4==1)
  166. sck<=1;
  167. else if(state==WRITE&&cnt4==3)
  168. sck<=0;
  169. else if (state==SE&&cnt4==1)
  170. sck<=1;
  171. else if(state==SE&&cnt4==3)
  172. sck<=0;
  173. else if (state==INIT_ADDR&&cnt4==1)
  174. sck<=1;
  175. else if(state==INIT_ADDR&&cnt4==3)
  176. sck<=0;
  177. always@(posedge sclk or negedge rst_n) //低电平传输数据 上升沿采集数据
  178. if(!rst_n)
  179. sdi<=1'b1;
  180. else if(state==WRITE)
  181. sdi<=wr_en[7-bit_cnt];
  182. else if(state==SE)
  183. sdi<=se_en[7-bit_cnt];
  184. else if(state==INIT_ADDR&&cnt_init_addr==0)
  185. sdi<=init_addr[23-bit_cnt];
  186. else if(state==INIT_ADDR&&cnt_init_addr==1)
  187. sdi<=init_addr[15-bit_cnt];
  188. else if(state==INIT_ADDR&&cnt_init_addr==2)
  189. sdi<=init_addr[7-bit_cnt];
  190. else sdi<=1'b1; //检查发现有问题
  191. always@(posedge sclk or negedge rst_n)
  192. if(!rst_n)
  193. led<=0;
  194. else if(cnt_3s_en==1)
  195. led<=1;
  196. else led<=0;
  197. always@(posedge sclk or negedge rst_n)
  198. if(!rst_n)
  199. sent_flag_out<=0;
  200. else if(cnt_wait_3s==CNT_wait_3s&&cnt_1s==ONE_S&&cnt_3s==2)
  201. sent_flag_out<=1;
  202. else sent_flag_out<=0;
  203. endmodule

 

  1. /***************************
  2. spi协议控制flash扇区数据输入
  3. ****************************/
  4. module flash_ctrl_wr(
  5. input wire sclk,
  6. input wire rst_n,
  7. input wire pi_flag,
  8. input wire pi_flag_dizhi,
  9. input wire [7:0] data_in,
  10. input wire stop_flag_rx, //发送端输入的停止位
  11. input wire [23:0] frame_wr_addr,
  12. output reg cs_n,
  13. output reg sck,
  14. output reg sdi
  15. );
  16. reg [9:0] state;
  17. parameter idle =10'b0000_0000_01;
  18. parameter WAIT1 =10'b0000_0000_10;
  19. parameter WRITE =10'b0000_0001_00;
  20. parameter WAIT2 =10'b0000_0010_00;
  21. parameter WAIT3 =10'b0000_0100_00;
  22. parameter WAIT4 =10'b0000_1000_00;
  23. parameter PP =10'b0001_0000_00;
  24. parameter INIT_ADDR =10'b0010_0000_00;
  25. parameter DATA_IN =10'b0100_0000_00;
  26. parameter WAIT5 =10'b1000_0000_00;
  27. reg [4:0] sclk_cnt;
  28. parameter SCLK_CNT=31;
  29. reg [1:0] cnt_init_addr;
  30. reg [1:0] cnt4;
  31. reg [2:0] bit_cnt;
  32. reg add_addr_flag;
  33. reg [23:0] init_addr;
  34. parameter INIT_ADDR_Location=6'h00_00_00;
  35. parameter wr_en=8'h06;
  36. parameter PP_en=8'h02;
  37. always@(posedge sclk or negedge rst_n)
  38. if(!rst_n)
  39. add_addr_flag<=0;
  40. else if(state==WAIT5&&sclk_cnt==SCLK_CNT)
  41. add_addr_flag<=1;
  42. else add_addr_flag<=0;
  43. always@(posedge sclk or negedge rst_n)
  44. if(!rst_n)
  45. init_addr<=INIT_ADDR_Location;
  46. else if(pi_flag_dizhi==1)
  47. init_addr<=frame_wr_addr;
  48. else if(add_addr_flag==1)
  49. init_addr<=init_addr+24'h0000_01; //字节自动加一,加到255后页自动加一
  50. //else init_addr<=24'd0;
  51. always@(posedge sclk or negedge rst_n)
  52. if(!rst_n)
  53. cnt4<=2'd0;
  54. else if(cnt4==3)
  55. cnt4<=2'd0;
  56. else if(state==WRITE||state==PP||state==INIT_ADDR||state==DATA_IN)
  57. cnt4<=cnt4+1;
  58. always@(posedge sclk or negedge rst_n)
  59. if(!rst_n)
  60. bit_cnt<=3'd0;
  61. else if(bit_cnt==7&&cnt4==3)
  62. bit_cnt<=3'd0;
  63. else if(cnt4==3)
  64. bit_cnt<=bit_cnt+1;
  65. always@(posedge sclk or negedge rst_n)
  66. if(!rst_n)
  67. cs_n<=1;
  68. else if(pi_flag==1)
  69. cs_n<=0;
  70. else if(state==WAIT2&&sclk_cnt==SCLK_CNT)
  71. cs_n<=1;
  72. else if(state==WAIT3&&sclk_cnt==SCLK_CNT)
  73. cs_n<=0;
  74. else if(sclk_cnt==SCLK_CNT&&state==WAIT5)
  75. cs_n<=1;
  76. always@(posedge sclk or negedge rst_n)
  77. if(!rst_n)
  78. sclk_cnt<=5'd0;
  79. else if (sclk_cnt==SCLK_CNT&&state==WAIT5)
  80. sclk_cnt<=5'd0;
  81. else if(sclk_cnt==SCLK_CNT)
  82. sclk_cnt<=5'd0;
  83. else if(cs_n==0)
  84. sclk_cnt<=sclk_cnt+1;
  85. else if(state==WAIT3)
  86. sclk_cnt<=sclk_cnt+1;
  87. always@(posedge sclk or negedge rst_n)
  88. if(!rst_n)
  89. cnt_init_addr<=2'd0;
  90. else if(cnt_init_addr==2'd2&&sclk_cnt==SCLK_CNT)
  91. cnt_init_addr<=2'd0;
  92. else if(sclk_cnt==SCLK_CNT&&state==INIT_ADDR)
  93. cnt_init_addr<=cnt_init_addr+1;
  94. always@(posedge sclk or negedge rst_n)
  95. if(!rst_n)
  96. state<=idle;
  97. else case(state)
  98. idle: if(pi_flag==1)
  99. state<=WAIT1;
  100. else state<=idle;
  101. WAIT1: if(sclk_cnt==SCLK_CNT)
  102. state<=WRITE;
  103. else state<=WAIT1;
  104. WRITE: if(sclk_cnt==SCLK_CNT)
  105. state<=WAIT2;
  106. else state<=WRITE;
  107. WAIT2: if(sclk_cnt==SCLK_CNT)
  108. state<=WAIT3;
  109. else state<=WAIT2;
  110. WAIT3: if(sclk_cnt==SCLK_CNT)
  111. state<=WAIT4;
  112. else state<=WAIT3;
  113. WAIT4: if(sclk_cnt==SCLK_CNT)
  114. state<=PP;
  115. PP: if(sclk_cnt==SCLK_CNT)
  116. state<=INIT_ADDR;
  117. else state<=PP;
  118. INIT_ADDR: if(cnt_init_addr==2'd2&&sclk_cnt==SCLK_CNT)
  119. state<=DATA_IN;
  120. else state<=INIT_ADDR;
  121. DATA_IN: if(sclk_cnt==SCLK_CNT)
  122. state<=WAIT5;
  123. else state<=DATA_IN;
  124. WAIT5: if(stop_flag_rx)
  125. state<=idle;
  126. else if(sclk_cnt==SCLK_CNT)
  127. state<=idle;
  128. else state<=WAIT5;
  129. default: state<=idle;
  130. endcase
  131. always@(posedge sclk or negedge rst_n) //时钟传递
  132. if(!rst_n)
  133. sck<=0;
  134. else if(state==WRITE &&cnt4==1)
  135. sck<=1;
  136. else if(state==WRITE&&cnt4==3)
  137. sck<=0;
  138. else if (state==PP&&cnt4==1)
  139. sck<=1;
  140. else if(state==PP&&cnt4==3)
  141. sck<=0;
  142. else if (state==INIT_ADDR&&cnt4==1)
  143. sck<=1;
  144. else if(state==INIT_ADDR&&cnt4==3)
  145. sck<=0;
  146. else if (state==DATA_IN&&cnt4==1)
  147. sck<=1;
  148. else if(state==DATA_IN&&cnt4==3)
  149. sck<=0;
  150. always@(posedge sclk or negedge rst_n)
  151. if(!rst_n)
  152. sdi<=1'b1;
  153. else if(state==WRITE)
  154. sdi<=wr_en[7-bit_cnt];
  155. else if(state==PP)
  156. sdi<=PP_en[7-bit_cnt];
  157. else if(state==INIT_ADDR&&cnt_init_addr==0)
  158. sdi<=init_addr[23-bit_cnt];
  159. else if(state==INIT_ADDR&&cnt_init_addr==1)
  160. sdi<=init_addr[15-bit_cnt];
  161. else if(state==INIT_ADDR&&cnt_init_addr==2)
  162. sdi<=init_addr[7-bit_cnt];
  163. else if(state==DATA_IN)
  164. sdi<=data_in[7-bit_cnt];
  165. else sdi<=1'b1;
  166. endmodule
  1. module key_rock(
  2. input wire sclk,
  3. input wire rst_n,
  4. input wire key_in,
  5. output reg key_o
  6. );
  7. reg [18:0] cnt;
  8. parameter CNT_MAX=500000-1;
  9. always@(posedge sclk or negedge rst_n)
  10. if(!rst_n)
  11. cnt<=1'b0;
  12. else if(key_in==1)
  13. cnt<=0;
  14. else if(cnt==CNT_MAX)
  15. cnt<=cnt;
  16. else
  17. cnt<=cnt+1'b1;
  18. always@(posedge sclk or negedge rst_n)
  19. if(!rst_n)
  20. key_o<=1'b0;
  21. else if (cnt==CNT_MAX-1)
  22. key_o<=1'b1;
  23. else
  24. key_o<=1'b0;
  25. endmodule
  1. module icap_ctrl(
  2. input wire sclk,
  3. input wire rst_n,
  4. input wire key_in,
  5. input wire [23:0] wr_addr_frame
  6. );
  7. reg [3:0] cnt;
  8. reg ce;
  9. reg [15:0] tmp_i;
  10. wire [15:0] i_data;
  11. always@(posedge sclk or negedge rst_n) //cnt14
  12. if(!rst_n)
  13. cnt<=4'd0;
  14. else if(cnt==14)
  15. cnt<=4'd0;
  16. else if (ce==0)
  17. cnt<=cnt+1'b1;
  18. always@(posedge sclk or negedge rst_n) //ce
  19. if(!rst_n)
  20. ce<=1'b1;
  21. else if(cnt==14)
  22. ce<=1'b1;
  23. else if (key_in==1) //不是很理解
  24. ce<=1'b0;
  25. always@(posedge sclk or negedge rst_n)
  26. if(!rst_n)
  27. tmp_i<=16'hffff;
  28. else case(cnt)
  29. 0: tmp_i<=16'hffff;
  30. 1: tmp_i<=16'haa99;
  31. 2: tmp_i<=16'h5566;
  32. 3: tmp_i<=16'h3261;
  33. 4: tmp_i<=wr_addr_frame[15:0]; //{data_uart,tmp_addr[7:0]};
  34. 5: tmp_i<=16'h3281;
  35. 6: tmp_i<={8'h03,wr_addr_frame[23:16]};//
  36. 7: tmp_i<=16'h32a1;
  37. 8: tmp_i<=16'h0000; //
  38. 9: tmp_i<=16'h32c1;
  39. 10: tmp_i<=16'h0300; //
  40. 11: tmp_i<=16'h30a1;
  41. 12: tmp_i<=16'h000e;
  42. 13: tmp_i<=16'h2000;
  43. 14: tmp_i<=16'hffff;
  44. default: tmp_i<=16'hffff;
  45. endcase
  46. assign i_data={tmp_i[8],tmp_i[9],tmp_i[10],tmp_i[11],tmp_i[12],tmp_i[13],tmp_i[14],tmp_i[15],
  47. tmp_i[0],tmp_i[1],tmp_i[2],tmp_i[3],tmp_i[4],tmp_i[5],tmp_i[6],tmp_i[7]};
  48. ICAP_SPARTAN6 #(
  49. .DEVICE_ID(28'h4000093), // Specifies the pre-programmed Device ID value
  50. .SIM_CFG_FILE_NAME("NONE") // Specifies the Raw Bitstream (RBT) file to be parsed by the simulation
  51. // model
  52. )
  53. ICAP_SPARTAN6_inst (
  54. .BUSY(), // 1-bit output: Busy/Ready output
  55. .O(), // 16-bit output: Configuartion data output bus
  56. .CE(ce), // 1-bit input: Active-Low ICAP Enable input
  57. .CLK(sclk), // 1-bit input: Clock input
  58. .I(i_data), // 16-bit input: Configuration data input bus
  59. .WRITE(1'b0) // 1-bit input: Read/Write control input
  60. );
  61. endmodule
  1. module tx_crtl(
  2. input wire sclk,
  3. input wire rst_n,
  4. input wire [7:0] data_in,
  5. input wire flag_in,
  6. output reg data_o
  7. );
  8. reg [12:0] cnt;
  9. reg [3:0] bit_cnt;
  10. reg tx_en;
  11. parameter CNT=5207;
  12. parameter BIT_CNT=8;
  13. reg [7:0] data_in_dely;
  14. always@(posedge sclk or negedge rst_n)
  15. if(!rst_n)
  16. data_in_dely<=8'd0;
  17. else if(flag_in==1)
  18. data_in_dely<=data_in;
  19. else if(tx_en==0)
  20. data_in_dely<=8'd0;
  21. //tx_en
  22. always@(posedge sclk or negedge rst_n)
  23. if(!rst_n)
  24. tx_en<=1'b0;
  25. else if(flag_in==1'b1)
  26. tx_en<=1'b1;
  27. else if(bit_cnt==BIT_CNT&&cnt==CNT)
  28. tx_en<=1'b0;
  29. //cnt 波特率计数
  30. always@(posedge sclk or negedge rst_n)
  31. if(!rst_n)
  32. cnt<=13'd0;
  33. else if(cnt==CNT)
  34. cnt<=13'd0;
  35. else if(tx_en==1'b1) //条件没写对
  36. cnt<=cnt+1'b1;
  37. //bit_cnt 字节统计
  38. always@(posedge sclk or negedge rst_n)
  39. if(!rst_n)
  40. bit_cnt<=4'd0;
  41. else if(tx_en==1'b0)
  42. bit_cnt<=4'd0;
  43. else if(bit_cnt==BIT_CNT&cnt==CNT)
  44. bit_cnt<=4'd0;
  45. else if(cnt==CNT)
  46. bit_cnt<=bit_cnt+1'b1;
  47. //输出数据控制
  48. always@(posedge sclk or negedge rst_n)
  49. if(!rst_n)
  50. data_o<=1'b1;
  51. else if(tx_en==1'b0) //flag_in==1'b1
  52. data_o<=1'b1;
  53. else if(bit_cnt==10'd0) //flag_in==1'b1
  54. data_o<=1'b0;
  55. else if(bit_cnt==10'd1)
  56. data_o<=data_in_dely[0];
  57. else if (bit_cnt==10'd2)
  58. data_o<=data_in_dely[1];
  59. else if(bit_cnt==10'd3)
  60. data_o<=data_in_dely[2];
  61. else if(bit_cnt==10'd4)
  62. data_o<=data_in_dely[3];
  63. else if(bit_cnt==10'd5)
  64. data_o<=data_in_dely[4];
  65. else if(bit_cnt==10'd6)
  66. data_o<=data_in_dely[5];
  67. else if(bit_cnt==10'd7)
  68. data_o<=data_in_dely[6];
  69. else if(bit_cnt==10'd8)
  70. data_o<=data_in_dely[7];
  71. //else if(bit_cnt==BIT_CNT)
  72. // data_o<=1'b1;
  73. else data_o<=1'b1;
  74. endmodule
  1. module top_updata(
  2. input wire sclk,
  3. input wire rst_n,
  4. input wire rx_uart_data,
  5. input wire key_in,
  6. output wire tx_data,
  7. output wire led,
  8. output wire cs_n,
  9. output wire sck,
  10. output wire sdi
  11. );
  12. wire key_inst_o;
  13. wire stop_flag_rx;
  14. wire flag_o_rx;
  15. wire [7:0] data_o_rx;
  16. wire wr_flag_frame_inst;
  17. wire [23:0] wr_addr_frame_inst;
  18. wire [7:0] wr_data_inst;
  19. wire se_flag_frame;
  20. wire [23:0] se_addr_frame;
  21. wire sent_flag_out_se_inst;
  22. wire tx_flag_frame;
  23. wire [7:0] tx_data_farme;
  24. wire wr_inst_cs_n;
  25. wire wr_inst_sck;
  26. wire wr_inst_sdi;
  27. wire se_inst_cs_n;
  28. wire se_inst_sck;
  29. wire se_inst_sdi;
  30. wire wr_flag_dizhi;
  31. assign cs_n=(wr_inst_cs_n&&se_inst_cs_n);
  32. assign sck=(wr_inst_sck||se_inst_sck);
  33. assign sdi=(wr_inst_sdi&&se_inst_sdi);
  34. key_rock key_rock_inst(
  35. .sclk (sclk),
  36. .rst_n (rst_n),
  37. .key_in (key_in),
  38. .key_o (key_inst_o)
  39. );
  40. icap_ctrl icap_ctrl_inst(
  41. .sclk (sclk),
  42. .rst_n (rst_n),
  43. .key_in (key_inst_o),
  44. .wr_addr_frame (wr_addr_frame_inst)
  45. );
  46. rx_crtl rx_crtl_inst(
  47. .sclk (sclk),
  48. .rst_n (rst_n),
  49. .rx_in (rx_uart_data),
  50. .stop_flag (stop_flag_rx),
  51. .flag_o (flag_o_rx),
  52. .data_o (data_o_rx)
  53. );
  54. w_farme w_farme_inst(
  55. .sclk (sclk),
  56. .rst_n (rst_n),
  57. .flag_uart (flag_o_rx),
  58. .data_uart (data_o_rx),
  59. .stop_flag (stop_flag_rx), //数据发送完成标志
  60. .sen_stop_flag (sent_flag_out_se_inst), //擦除完成标识
  61. .wr_flag_dizhi (wr_flag_dizhi),
  62. .wr_flag (wr_flag_frame_inst),
  63. .wr_addr (wr_addr_frame_inst),
  64. .wr_data (wr_data_inst),
  65. .se_addr (se_addr_frame),
  66. .se_flag (se_flag_frame),
  67. .tx_flag (tx_flag_frame),
  68. .tx_data (tx_data_farme) //擦除结束用55标志,发生完成用aa标识
  69. );
  70. flash_ctrl_wr flash_ctrl_wr_inst(
  71. .sclk (sclk),
  72. .rst_n (rst_n),
  73. .pi_flag (wr_flag_frame_inst),
  74. .data_in (wr_data_inst),
  75. .stop_flag_rx (stop_flag_rx), //发送端输入的停止位
  76. .frame_wr_addr (wr_addr_frame_inst),
  77. .pi_flag_dizhi (wr_flag_dizhi),
  78. .cs_n (wr_inst_cs_n),
  79. .sck (wr_inst_sck),
  80. .sdi (wr_inst_sdi)
  81. );
  82. flash_ctrl_se flash_ctrl_se_inst(
  83. .sclk (sclk),
  84. .rst_n (rst_n),
  85. .pi_se_flag (se_flag_frame),
  86. .se_addr_in (se_addr_frame),
  87. .led (led),
  88. .cs_n (se_inst_cs_n),
  89. .sck (se_inst_sck),
  90. .sdi (se_inst_sdi),
  91. .sent_flag_out (sent_flag_out_se_inst) //地址清零结束位
  92. );
  93. tx_crtl tx_crtl_inst(
  94. .sclk (sclk),
  95. .rst_n (rst_n),
  96. .data_in (tx_data_farme),
  97. .flag_in (tx_flag_frame),
  98. .data_o (tx_data)
  99. );
  100. endmodule
  1. `timescale 1ns/1ns
  2. module tb_update;
  3. reg sclk;
  4. reg rst_n;
  5. reg rx;
  6. reg[7:0] a_mem[18:0]; //当前为测试flash写模块 擦出数据为55 55 55 55 55 55 55 d5 aa 10 00 00
  7. initial $readmemh("./data.txt", a_mem); //测试flash写入数据为55 55 55 55 55 55 55 d5 55 10 00 00 01 02 03 04 05 aa 55
  8. initial
  9. begin
  10. sclk = 1'b1;
  11. rst_n <= 1'b0;
  12. #300
  13. rst_n <= 1'b1;
  14. end
  15. always #10 sclk = ~sclk;
  16. initial
  17. begin
  18. rx <= 1'b1;
  19. #2000
  20. rx_byte();
  21. end
  22. task rx_byte();
  23. integer j;//定义一个整型变量
  24. for(j=0;j<19;j=j+1)//for循环 测试的时候,数据加到原来的256应该是86
  25. rx_bit(a_mem[j]);//a_mem[j]是data.txt文件里面第j个8比特数据
  26. //j每次取一个值,就调用一次rx_bit();
  27. //一共调用256
  28. endtask
  29. task rx_bit(input [7:0] data);//data是a_mem[j]的值。
  30. integer i;
  31. for(i=0;i<10;i=i+1)
  32. begin
  33. case(i)
  34. 0: rx <= 1'b0;//起始位
  35. 1: rx <= data[0];
  36. 2: rx <= data[1];
  37. 3: rx <= data[2];
  38. 4: rx <= data[3];
  39. 5: rx <= data[4];
  40. 6: rx <= data[5];
  41. 7: rx <= data[6];
  42. 8: rx <= data[7];
  43. //上面8个发送的是数据位
  44. 9: rx <= 1'b1;//停止位
  45. endcase
  46. #104140;//一个波特时间=sclk周期*波特计数器
  47. end
  48. endtask
  49. defparam top_updata_inst.flash_ctrl_se_inst.ONE_S=500;
  50. //defparam top_updata_inst.rx_crtl_inst.CNT=9;
  51. //defparam top_updata_inst.rx_crtl_inst.bit_flag_cnt=4;
  52. //defparam top_updata_inst.tx_crtl_inst.CNT=10;
  53. top_updata top_updata_inst(
  54. .sclk (sclk),
  55. .rst_n (rst_n),
  56. .rx_uart_data (rx),
  57. .key_in ()
  58. );
  59. endmodule

4.这次比较难调试的frame_ctrl模块,多次仿真最终达到目的

5.如果仿真通过,下载只办卡却没有达到应有效果,就需要利用ise的chipscope对内部信号进行抓取。

6.擦除调试如图:

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

闽ICP备14008679号