• FPGA project : flash_read


    实验目标:

    flash的普通读指令,在指定地址开始读。可以更改地址与读的数据个数。

    先发送读指令+扇区地址+页地址+字节地址。

    然后读数据。再把读到的串行数据转化为8bit的数据,存入fifo。

    然后读出FIFO中数据,通过uart_tx模块发送给上位机。

    经验总结:

    接收数据:比如接收8bit的串行数据,通过miso传递。

    1,先接收高位。

    reg         [7:0]        data ;

    那么通过data保存miso传递的数据,把串行数据,转换为并行数据。

    有两种常用写法:

    data <= {data[6:0],miso};

    或者

    data <= data << 1 + miso ;

    或者:写一个cnt_bit,记录保存到第几bit。

    data[cnt_bit] <= miso ;

    2,先接收低位

    data <= {miso,data[7:1]};

    data[cnt_bit] <= miso ;

    小技巧:

    画时序图时不一定要先画内部信号,再画输出端口信号。

    按照自己的设计思路,该到那个信号就画那个信号,画完也不要改,

    写代码时,按照这个思路,这个画时序图的顺序,编写代码。

    相当于再次检查一遍,即容易排错,有容易编写代码。

    状态机:

    模块框图:

    时序图: 

    代码: 

    1. module spi (
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire key_flag ,
    5. input wire miso ,
    6. output reg cs_n ,
    7. output reg sck ,
    8. output reg mosi ,
    9. output reg po_flag ,
    10. output wire [7:0] po_data
    11. );
    12. // localparam define 一般状态机的状态定义用局部参数就可以。
    13. localparam IDLE = 4'b0001 ,
    14. INSTRUCT = 4'b0010 ,
    15. READ = 4'b0100 ,
    16. SEND = 4'b1000 ;
    17. // parameter define 指令,计数器最大值,用全局参数定义。
    18. parameter COMD_REA = 8'h03 , // comd_read
    19. ADDR_SEC = 8'h00 , // address_secter 扇区地址
    20. ADDR_PAG = 8'h00 , // address_page 页地址(行地址)
    21. ADDR_BYT = 8'h00 , // assress_byte 字节地址
    22. NUM_COMD = 4'd4 ; // 用来记录在指令状态传递指令和地址byte数量
    23. parameter CNT_MAX_BYTE = 11'd300 , // 4 + 要读出的数据。例如: 4 + 256
    24. CNT_MAX_SEND = 20'd53000 ;
    25. // reg signal define
    26. reg [3:0] state_c ;
    27. reg [3:0] state_n ;
    28. reg cnt_20_ns ;
    29. reg [2:0] cnt_bit ;
    30. reg [10:0] cnt_byte ;
    31. reg flag_b ; // flag_byte
    32. reg flagBreg ;
    33. reg flag_R_S ; // flag_byte
    34. reg flag_RSr ;
    35. reg [7:0] datInFifo ; // data_in_fifo
    36. reg flag_data ; // flag_data 采样标志信号
    37. reg flaInFifo ; // flag_in_fifo
    38. reg [19:0] cnt_send ; // uart_tx模块发送1byte数据的等待时间。
    39. reg flaSenEnd ; // 计数器cnt_send计数到CNT_MAX_SEND - 2 拉高一个时钟周期,
    40. reg flag_out_fifo_reg ;
    41. // wire signal define
    42. wire empty ;
    43. wire full ;
    44. wire flaOutFif ; // flag_out_fifo
    45. wire [9:0] usedw ; // fifo中存储的数据量
    46. wire IDLEtoINSTRUCT ;
    47. wire INSTRUCTto_READ ;
    48. wire READtoSEND ;
    49. wire SENDtoIDLE ;
    50. /**********************************************************************/
    51. // // reg signal describe
    52. /*******状态机采用三段式描述*******/
    53. // reg [3:0] state_c ;
    54. // reg [3:0] state_n ;
    55. always @(posedge sys_clk or negedge sys_rst_n) begin
    56. if(~sys_rst_n)
    57. state_c <= IDLE ;
    58. else
    59. state_c <= state_n ;
    60. end
    61. always @(*) begin
    62. case (state_c)
    63. IDLE : if(IDLEtoINSTRUCT)
    64. state_n <= INSTRUCT ;
    65. else
    66. state_n <= IDLE ;
    67. INSTRUCT : if(INSTRUCTto_READ)
    68. state_n <= READ ;
    69. else
    70. state_n <= INSTRUCT ;
    71. READ : if(READtoSEND)
    72. state_n <= SEND ;
    73. else
    74. state_n <= READ ;
    75. SEND : if(SENDtoIDLE)
    76. state_n <= IDLE ;
    77. else
    78. state_n <= SEND ;
    79. default: state_n <= IDLE ;
    80. endcase
    81. end
    82. assign IDLEtoINSTRUCT = (state_c == IDLE ) && (key_flag) ;
    83. assign INSTRUCTto_READ = (state_c == INSTRUCT) && (flagBreg) ; // 指令的的最后1byte发送完毕
    84. assign READtoSEND = (state_c == READ ) && (flag_RSr) ; // 读完想要的最后1byte
    85. assign SENDtoIDLE = (state_c == SEND ) && (flaSenEnd && empty) ;
    86. // reg cnt_20_ns ;
    87. always @(posedge sys_clk or negedge sys_rst_n) begin
    88. if(~sys_rst_n)
    89. cnt_20_ns <= 1'b0 ;
    90. else if(state_c == INSTRUCT || state_c == READ)
    91. cnt_20_ns <= cnt_20_ns + 1'b1 ;
    92. else if(state_c != INSTRUCT || state_c != READ)
    93. cnt_20_ns <= 1'b0 ;
    94. else
    95. cnt_20_ns <= 1'b0 ;
    96. end
    97. // reg [2:0] cnt_bit ;
    98. always @(posedge sys_clk or negedge sys_rst_n) begin
    99. if(~sys_rst_n)
    100. cnt_bit <=3'd0 ;
    101. else
    102. case (state_c)
    103. IDLE : cnt_bit <=3'd0 ;
    104. INSTRUCT: if(!cnt_20_ns && sck && cnt_bit == 7)
    105. cnt_bit <= 3'd0 ;
    106. else if(!cnt_20_ns && sck)
    107. cnt_bit <= cnt_bit + 1'b1 ;
    108. READ : if(!cnt_20_ns && sck && cnt_bit == 7)
    109. cnt_bit <= 3'd0 ;
    110. else if(!cnt_20_ns && sck)
    111. cnt_bit <= cnt_bit + 1'b1 ;
    112. SEND : cnt_bit <=3'd0 ;
    113. default : cnt_bit <=3'd0 ;
    114. endcase
    115. end
    116. // reg [10:0] cnt_byte ;
    117. always @(posedge sys_clk or negedge sys_rst_n) begin
    118. if(~sys_rst_n)
    119. cnt_byte <= 4'd0 ;
    120. else if(cnt_bit == 7 && cnt_byte == CNT_MAX_BYTE - 1 && !cnt_20_ns && sck)
    121. cnt_byte <= 4'd0 ;
    122. else if(cnt_bit == 7 && !cnt_20_ns && sck)
    123. cnt_byte <= cnt_byte + 1'b1 ;
    124. else
    125. cnt_byte <= cnt_byte ;
    126. end
    127. // reg flag_R_S ;
    128. // reg flag_b ;
    129. always @(posedge sys_clk or negedge sys_rst_n) begin
    130. if(~sys_rst_n) begin
    131. flag_b <= 1'b0 ;
    132. flag_R_S <= 1'b0 ;
    133. end
    134. else
    135. case (state_c)
    136. IDLE : begin
    137. flag_b <= 1'b0 ;
    138. flag_R_S <= 1'b0 ;
    139. end
    140. INSTRUCT: begin
    141. if((cnt_byte == NUM_COMD - 1) && (cnt_bit == 7) && !cnt_20_ns && sck)
    142. flag_b <= 1'b1 ;
    143. else
    144. flag_b <= flag_b ;
    145. flag_R_S <= 1'b0 ;
    146. end
    147. READ : begin
    148. if(cnt_byte == NUM_COMD)
    149. flag_R_S <= 1'b0 ;
    150. else if((cnt_byte == CNT_MAX_BYTE - 1) && (cnt_bit == 7) && !cnt_20_ns && sck)
    151. flag_R_S <= 1'b1 ;
    152. flag_b <= 1'b0 ;
    153. end
    154. SEND : begin
    155. flag_b <= 1'b0 ;
    156. flag_R_S <= 1'b0 ;
    157. end
    158. default : begin
    159. flag_b <= 1'b0 ;
    160. flag_R_S <= 1'b0 ;
    161. end
    162. endcase
    163. end
    164. // reg flagBreg ;
    165. // reg flag_RSr ;
    166. always @(posedge sys_clk or negedge sys_rst_n) begin
    167. if(~sys_rst_n)
    168. flagBreg <= 1'b0 ;
    169. else
    170. flagBreg <= flag_b ;
    171. end
    172. always @(posedge sys_clk or negedge sys_rst_n) begin
    173. if(~sys_rst_n)
    174. flag_RSr <= 1'b0 ;
    175. else
    176. flag_RSr <= flag_R_S ;
    177. end
    178. // reg [7:0] datInFifo ; // data_in_fifo
    179. always @(posedge sys_clk or negedge sys_rst_n) begin
    180. if(~sys_rst_n)
    181. datInFifo <= 1'b0 ;
    182. else if(flag_data)
    183. datInFifo <= {miso,datInFifo[7:1]}; // 读flash中数据,先传的低位。
    184. else
    185. datInFifo <= datInFifo ;
    186. end
    187. // reg flag_data ; // flag_data 采样标志信号
    188. always @(posedge sys_clk or negedge sys_rst_n) begin
    189. if(~sys_rst_n)
    190. flag_data <= 1'b0 ;
    191. else if(state_c == READ) begin
    192. if(cnt_20_ns && !sck)
    193. flag_data <= 1'b1 ;
    194. else
    195. flag_data <= 1'b0 ;
    196. end else begin
    197. flag_data <= 1'b0 ;
    198. end
    199. end
    200. // reg flaInFifo ; // flag_in_fifo
    201. always @(posedge sys_clk or negedge sys_rst_n) begin
    202. if(~sys_rst_n)
    203. flaInFifo <= 1'b0 ;
    204. else if(state_c == READ && cnt_bit == 7 && flag_data)
    205. flaInFifo <= 1'b1 ;
    206. else
    207. flaInFifo <= 1'b0 ;
    208. end
    209. // reg [19:0] cnt_send ; // uart_tx模块发送1byte数据的等待时间。
    210. always @(posedge sys_clk or negedge sys_rst_n) begin
    211. if(~sys_rst_n)
    212. cnt_send <= 20'd0 ;
    213. else
    214. if(state_c == SEND) begin
    215. if(cnt_send == CNT_MAX_SEND - 1)
    216. cnt_send <= 20'd0 ;
    217. else
    218. cnt_send <= cnt_send + 1'b1 ;
    219. end
    220. else
    221. cnt_send <= 20'd0 ;
    222. end
    223. // reg flag_out_fifo_reg ;
    224. always @(posedge sys_clk or negedge sys_rst_n) begin
    225. if(~sys_rst_n)
    226. flag_out_fifo_reg <= 1'b0 ;
    227. else if(flaSenEnd && !empty)
    228. flag_out_fifo_reg <= 1'b1 ;
    229. else
    230. flag_out_fifo_reg <= 1'b0 ;
    231. end
    232. // reg flaSenEnd ;
    233. always @(posedge sys_clk or negedge sys_rst_n) begin
    234. if(~sys_rst_n)
    235. flaSenEnd <= 1'b0 ;
    236. else if(cnt_send == CNT_MAX_SEND - 2)
    237. flaSenEnd <= 1'b1 ;
    238. else
    239. flaSenEnd <= 1'b0 ;
    240. end
    241. // output signal describe
    242. // cs_n ,
    243. always @(posedge sys_clk or negedge sys_rst_n) begin
    244. if(~sys_rst_n)
    245. cs_n <= 1'b1 ;
    246. else
    247. case (state_c)
    248. IDLE : if(key_flag)
    249. cs_n <= 1'b0 ;
    250. else
    251. cs_n <= cs_n ;
    252. INSTRUCT: cs_n <= cs_n ;
    253. READ : cs_n <= cs_n ;
    254. SEND : cs_n <= 1'b1 ;
    255. default : cs_n <= 1'b1 ;
    256. endcase
    257. end
    258. // sck ,
    259. always @(posedge sys_clk or negedge sys_rst_n) begin
    260. if(~sys_rst_n)
    261. sck <= 1'b0 ;
    262. else
    263. case (state_c)
    264. IDLE : sck <= 1'b0 ;
    265. INSTRUCT: if(cnt_20_ns)
    266. sck <= ~sck ;
    267. else
    268. sck <= sck ;
    269. READ : if(cnt_20_ns)
    270. sck <= ~sck ;
    271. else
    272. sck <= sck ;
    273. SEND : sck <= 1'b0 ;
    274. default : sck <= 1'b0 ;
    275. endcase
    276. end
    277. // mosi ,
    278. always @(posedge sys_clk or negedge sys_rst_n) begin
    279. if(~sys_rst_n) begin
    280. mosi <= 1'b0 ;
    281. end else begin
    282. case (state_c)
    283. IDLE : mosi <= 1'b0 ;
    284. INSTRUCT: case (cnt_byte)
    285. 0 : if(cnt_bit == 0)
    286. mosi <= COMD_REA[7] ;
    287. else if(cnt_20_ns && sck)
    288. mosi <= COMD_REA[7 - cnt_bit] ;
    289. else
    290. mosi <= mosi ;
    291. 1 : if(cnt_bit == 0)
    292. mosi <= ADDR_SEC[7] ;
    293. else if(cnt_20_ns && sck)
    294. mosi <= ADDR_SEC[7 - cnt_bit] ;
    295. else
    296. mosi <= mosi ;
    297. 2 : if(cnt_bit == 0)
    298. mosi <= ADDR_PAG[7] ;
    299. else if(cnt_20_ns && sck)
    300. mosi <= ADDR_PAG[7 - cnt_bit] ;
    301. else
    302. mosi <= mosi ;
    303. 3 : if(cnt_bit == 0)
    304. mosi <= ADDR_BYT[7] ;
    305. else if(cnt_20_ns && sck)
    306. mosi <= ADDR_BYT[7 - cnt_bit] ;
    307. else
    308. mosi <= mosi ;
    309. default : mosi <= 1'b0 ;
    310. endcase
    311. READ : mosi <= 1'b0 ;
    312. SEND : mosi <= 1'b0 ;
    313. default : mosi <= 1'b0 ;
    314. endcase
    315. end
    316. end
    317. // po_flag ,
    318. always @(posedge sys_clk or negedge sys_rst_n) begin
    319. if(~sys_rst_n)
    320. po_flag <= 1'b0 ;
    321. else
    322. po_flag <= flag_out_fifo_reg ;
    323. end
    324. // wire [7:0] po_data ;// 直接连接到fifo的输出端口。
    325. // */
    326. /***********************例化FIFO***************************************/
    327. assign flaOutFif = flag_out_fifo_reg ;
    328. fifo_1024x8 fifo_1024x8_inst(
    329. .clock ( sys_clk ) ,
    330. .data ( datInFifo ) ,
    331. .rdreq ( flaOutFif ) ,
    332. .wrreq ( flaInFifo ) ,
    333. .empty ( empty ) ,
    334. .full ( full ) ,
    335. .q ( po_data ) ,
    336. .usedw ( usedw )
    337. );
    338. endmodule
    1. module top (
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire key_in ,
    5. input wire miso ,
    6. output wire cs_n ,
    7. output wire sck ,
    8. output wire mosi ,
    9. output wire tx
    10. );
    11. // 例化间连线
    12. wire key_flag ;
    13. wire po_flag ;
    14. wire [7:0] po_data ;
    15. key_filter key_filter_isnt(
    16. .sys_clk ( sys_clk ) ,
    17. .sys_rst_n ( sys_rst_n ) ,
    18. .key_in ( key_in ) ,
    19. .key_out ( key_flag )
    20. );
    21. spi spi_inst(
    22. .sys_clk ( sys_clk ) ,
    23. .sys_rst_n ( sys_rst_n ) ,
    24. .key_flag ( key_flag ) ,
    25. .miso ( miso ) ,
    26. .cs_n ( cs_n ) ,
    27. .sck ( sck ) ,
    28. .mosi ( mosi ) ,
    29. .po_flag ( po_flag ) ,
    30. .po_data ( po_data )
    31. );
    32. uart_tx uart_tx_isnt(
    33. .sys_clk ( sys_clk ) ,
    34. .sys_rst_n ( sys_rst_n ) ,
    35. .pi_flag ( po_flag ) ,
    36. .pi_data ( po_data ) ,
    37. .tx ( tx )
    38. );
    39. endmodule

     

    1. module key_filter
    2. #(
    3. parameter MAX_CNT_20MS = 20'd100_0000
    4. )(
    5. input wire sys_clk ,
    6. input wire sys_rst_n ,
    7. input wire key_in ,
    8. output wire key_out
    9. );
    10. reg key_r_0 ;
    11. reg key_r_1 ;
    12. wire nege ;
    13. wire pose ;
    14. reg [19:00] cnt_20ms ;
    15. wire add_cnt_20ms ;
    16. wire end_cnt_20ms ;
    17. reg add_cnt_flag ;
    18. // key_r_0 key_r_1
    19. always @(posedge sys_clk or negedge sys_rst_n) begin
    20. if(~sys_rst_n) begin
    21. key_r_0 <= 1'b1 ;
    22. end else begin
    23. key_r_0 <= key_in ;
    24. end
    25. end
    26. always @(posedge sys_clk or negedge sys_rst_n) begin
    27. if(~sys_rst_n) begin
    28. key_r_1 <= 1'b1 ;
    29. end else begin
    30. key_r_1 <= key_r_0 ;
    31. end
    32. end
    33. // nege pose
    34. assign nege = ~key_r_0 && key_r_1 ;
    35. assign pose = key_r_0 && ~key_r_1 ;
    36. // add_cnt_flag
    37. always @(posedge sys_clk or negedge sys_rst_n) begin
    38. if(~sys_rst_n) begin
    39. add_cnt_flag <= 1'b0 ;
    40. end else begin
    41. if(nege) begin
    42. add_cnt_flag <= 1'b1 ;
    43. end else begin
    44. if( pose || end_cnt_20ms ) begin
    45. add_cnt_flag <= 1'b0 ;
    46. end else begin
    47. add_cnt_flag <= add_cnt_flag ;
    48. end
    49. end
    50. end
    51. end
    52. // cnt_20ms add_cnt_20ms end_cnt_20ms
    53. always @(posedge sys_clk or negedge sys_rst_n) begin
    54. if(~sys_rst_n) begin
    55. cnt_20ms <= 20'd0 ;
    56. end else begin
    57. if(add_cnt_20ms) begin
    58. if(end_cnt_20ms) begin
    59. cnt_20ms <= 20'd0 ;
    60. end else begin
    61. cnt_20ms <= cnt_20ms + 20'd1 ;
    62. end
    63. end else begin
    64. cnt_20ms <= 20'd0 ;
    65. end
    66. end
    67. end
    68. assign add_cnt_20ms = add_cnt_flag ;
    69. assign end_cnt_20ms = add_cnt_20ms && cnt_20ms == ( MAX_CNT_20MS - 1'b1 ) ;
    70. // key_out
    71. // always @(posedge sys_clk or negedge sys_rst_n) begin
    72. // // always @(*) begin // 这样的话 会综合成 数据选择器
    73. // if(~sys_rst_n) begin
    74. // key_out <= 1'b0 ;
    75. // end else begin
    76. // if(end_cnt_20ms) begin
    77. // key_out <= 1'b1 ;
    78. // end else begin
    79. // key_out <= 1'b0 ;
    80. // end
    81. // end
    82. // end
    83. assign key_out = end_cnt_20ms ;
    84. endmodule

     

    1. module uart_tx (
    2. input wire sys_clk ,
    3. input wire sys_rst_n ,
    4. input wire pi_flag ,
    5. input wire [7:0] pi_data ,
    6. output reg tx
    7. );
    8. // parameter
    9. parameter SUB_1K = 1000 , // 缩减第十位,空闲位的时间。
    10. CLK_UART = 50_000_000 ,
    11. BPS = 9600 ;
    12. localparam MAX_BPS = CLK_UART / BPS ;
    13. // reg signal define
    14. reg pi_flag_reg1 ;
    15. reg [ 7:0] pi_data_reg1 ;
    16. reg work_en ;
    17. reg [12:0] cnt_bps ;
    18. reg [ 3:0] cnt_bit ;
    19. reg bit_flag ;
    20. /**********************************************/
    21. // reg pi_flag_reg1 ;
    22. always @(posedge sys_clk or negedge sys_rst_n) begin
    23. if(~sys_rst_n)
    24. pi_flag_reg1 <= 1'b0 ;
    25. else
    26. pi_flag_reg1 <= pi_flag ;
    27. end
    28. // reg pi_data_reg1 ;
    29. always @(posedge sys_clk or negedge sys_rst_n) begin
    30. if(~sys_rst_n)
    31. pi_data_reg1 <= 8'd0 ;
    32. else
    33. pi_data_reg1 <= pi_data ;
    34. end
    35. // reg work_en ;
    36. always @(posedge sys_clk or negedge sys_rst_n) begin
    37. if(~sys_rst_n)
    38. work_en <= 1'b0 ;
    39. else if(((cnt_bit == 4'd0) && pi_flag_reg1) || (cnt_bit == 4'd9) && (bit_flag))
    40. work_en <= ~work_en ;
    41. else
    42. work_en <= work_en ;
    43. end
    44. // reg [12:0] cnt_bps ;
    45. always @(posedge sys_clk or negedge sys_rst_n) begin
    46. if(~sys_rst_n)
    47. cnt_bps <= 13'd0 ;
    48. else if(work_en && cnt_bps == MAX_BPS - 1) // 波特率计数器计数到最大值。
    49. cnt_bps <= 13'd0 ;
    50. else if(work_en)
    51. cnt_bps <= cnt_bps + 1'b1 ;
    52. else
    53. cnt_bps <= 13'd0 ;
    54. end
    55. // reg bit_flag ;
    56. always @(posedge sys_clk or negedge sys_rst_n) begin
    57. if(~sys_rst_n)
    58. bit_flag <= 1'b0 ;
    59. else if((work_en && cnt_bps == MAX_BPS - 1) || (work_en && cnt_bps == MAX_BPS - SUB_1K && cnt_bit == 9))
    60. bit_flag <= 1'b1 ;
    61. else
    62. bit_flag <= 1'b0 ;
    63. end
    64. // reg [ 3:0] cnt_bit ;
    65. always @(posedge sys_clk or negedge sys_rst_n) begin
    66. if(~sys_rst_n)
    67. cnt_bit <= 4'd0 ;
    68. else if(work_en && bit_flag && cnt_bit == 4'd9) // 传递完第十位,位计数器要归零。
    69. cnt_bit <= 4'd0 ;
    70. else if(work_en && bit_flag)
    71. cnt_bit <= cnt_bit + 1'b1 ;
    72. else if(work_en)
    73. cnt_bit <= cnt_bit ;
    74. else
    75. cnt_bit <= 4'd0 ;
    76. end
    77. /****************************************/
    78. // output signal
    79. // tx
    80. always @(posedge sys_clk or negedge sys_rst_n) begin
    81. if(~sys_rst_n)
    82. tx <= 1'b1 ;
    83. else if(work_en) begin
    84. case (cnt_bit)
    85. 0 : tx <= 1'b0 ;
    86. 1 : tx <= pi_data_reg1[0] ; // 先发最低位。
    87. 2 : tx <= pi_data_reg1[1] ;
    88. 3 : tx <= pi_data_reg1[2] ;
    89. 4 : tx <= pi_data_reg1[3] ;
    90. 5 : tx <= pi_data_reg1[4] ;
    91. 6 : tx <= pi_data_reg1[5] ;
    92. 7 : tx <= pi_data_reg1[6] ;
    93. 8 : tx <= pi_data_reg1[7] ;
    94. 9 : tx <= 1'b1 ;
    95. default: tx <= 1'b1 ;
    96. endcase
    97. end else begin
    98. tx <= 1'b1 ;
    99. end
    100. end
    101. endmodule

     

    1. `timescale 1ns/1ns
    2. module test_spi();
    3. reg sys_clk ;
    4. reg sys_rst_n ;
    5. reg key_flag ;
    6. wire miso ;
    7. wire cs_n ;
    8. wire sck ;
    9. wire mosi ;
    10. wire po_flag ;
    11. wire [7:0] po_data ;
    12. defparam memory.mem_access.initfile = "initmemory.txt";
    13. defparam spi_inst.CNT_MAX_SEND = 100 ;
    14. m25p16 memory (
    15. .c ( sck ) ,
    16. .data_in ( mosi ) ,
    17. .s ( cs_n ) ,
    18. .w ( 1'b1 ) ,
    19. .hold ( 1'b1 ) ,
    20. .data_out ( miso )
    21. );
    22. spi spi_inst(
    23. .sys_clk ( sys_clk ) ,
    24. .sys_rst_n ( sys_rst_n ) ,
    25. .key_flag ( key_flag ) ,
    26. .miso ( miso ) ,
    27. .cs_n ( cs_n ) ,
    28. .sck ( sck ) ,
    29. .mosi ( mosi ) ,
    30. .po_flag ( po_flag ) ,
    31. .po_data ( po_data )
    32. );
    33. parameter CYCLE = 20 ;
    34. initial begin
    35. sys_clk = 1'b1 ;
    36. sys_rst_n <= 1'b0 ;
    37. key_flag <= 1'b0 ;
    38. #(CYCLE) ;
    39. sys_rst_n <= 1'b1 ;
    40. #(CYCLE*10) ;
    41. #(CYCLE * 100) ;
    42. key_flag <= 1'b1 ;
    43. #(CYCLE) ;
    44. key_flag <= 1'b0 ;
    45. end
    46. always #(CYCLE/2) sys_clk = ~sys_clk ;
    47. endmodule

     仿真波形:

    上版验证通过。 

  • 相关阅读:
    3.Vue从入门到精通 (第三章 使用Vue脚手架)
    零知识证明经典文献大汇总(可收藏)
    力扣 轮转数组三段逆置法和三段拷贝法(C语言)
    BERT-MRC数据预处理解读(以datasets squad数据为例)
    【数据结构】队列(C语言实现)
    单细胞测序实践
    vue3 实现简易滚动效果
    Web自动化测试-掌握selenium工具用法,使用WebDriver测试Chrome/FireFox网页(Java
    Flex布局详解
    【C++从0到王者】C++11(全文三万字,超详解)
  • 原文地址:https://blog.csdn.net/Meng_long2022/article/details/133817285