Advertisement
Guest User

Untitled

a guest
Jan 18th, 2020
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.50 KB | None | 0 0
  1. module simple_spi(MAX10_CLK1_50, GPIO, KEY, LEDR);
  2.  
  3. input MAX10_CLK1_50;
  4. input [35:0] GPIO;
  5. input [1:0] KEY;
  6. output [9:0] LEDR;
  7.  
  8. wire sys_clk = MAX10_CLK1_50;
  9. wire sys_rst_n = KEY[1];
  10.  
  11. wire spi_sck = GPIO[0];
  12. wire spi_cs = GPIO[1];
  13. wire spi_mosi = GPIO[2];
  14.  
  15. wire sck_rs_edg;
  16. wire tr_cmplt;
  17.  
  18. reg [7:0] user_reg_ff;
  19. reg [7:0] spi_dat_ff;
  20.  
  21. reg [2:0] sck_sync_ff;
  22. reg [2:0] cs_sync_ff;
  23. reg [1:0] mosi_sync_ff;
  24.  
  25. assign LEDR = user_reg_ff;
  26.  
  27. assign sck_rs_edg = ~sck_sync_ff[2] & sck_sync_ff[1];
  28. assign tr_cmplt = ~cs_sync_ff[2] & cs_sync_ff[1];
  29.  
  30. // you should obligatorily implement reset on all control lines
  31. always @(posedge sys_clk, negedge sys_rst_n) begin
  32. if (~sys_rst_n) begin
  33. sck_sync_ff <= 3'b000;
  34. end else begin
  35. sck_sync_ff <= {sck_sync_ff[1:0], spi_sck};
  36. end
  37. end
  38.  
  39. always @(posedge sys_clk, negedge sys_rst_n) begin
  40. if (~sys_rst_n) begin
  41. cs_sync_ff <= 3'b111;
  42. end else begin
  43. cs_sync_ff <= {cs_sync_ff[1:0], spi_cs};
  44. end
  45. end
  46.  
  47. // it is not necessary implement reset on data lines
  48. // but you can do it if you want
  49. always @(posedge sys_clk)
  50. mosi_sync_ff <= {mosi_sync_ff[0], spi_mosi};
  51.  
  52. always @(posedge sys_clk) begin
  53. if (sck_rs_edg)
  54. spi_dat_ff <= {spi_dat_ff[6:0], mosi_sync_ff[1]};
  55. end
  56.  
  57. always @(posedge sys_clk)
  58. if (tr_cmplt)
  59. user_reg_ff <= spi_dat_ff;
  60.  
  61. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement