[1885] | 1 | module at_boot_reg_writer |
---|
| 2 | ( |
---|
[1898] | 3 | input clk, |
---|
[1885] | 4 | |
---|
[1898] | 5 | input clk_src_sel, //1=on-board, 0=off-board |
---|
[1885] | 6 | |
---|
| 7 | output spi_running, |
---|
| 8 | |
---|
| 9 | output spi_mosi, |
---|
| 10 | output spi_sclk, |
---|
| 11 | output reg spi_csn = 1 |
---|
| 12 | ); |
---|
| 13 | |
---|
[1886] | 14 | parameter INCLUDE_IBUFGDS = 1; |
---|
[1885] | 15 | parameter NUM_REGS = 3; |
---|
| 16 | |
---|
| 17 | //AD9512 registers are 8 bits each, addressed by 7 bit addresses |
---|
| 18 | |
---|
| 19 | //reg45[0]: clock src sel (0=CLK2=off-board, 1=CLK1=on-board) |
---|
| 20 | parameter ADDR0 = 7'h45; |
---|
| 21 | parameter DATA0 = 8'b0000_0000; //LSB to be overwritten by config input |
---|
| 22 | |
---|
| 23 | //reg51[7]: bypass divider for OUT3 (1=bypass) |
---|
| 24 | parameter ADDR1 = 7'h51; |
---|
| 25 | parameter DATA1 = 8'b1000_0000; |
---|
| 26 | |
---|
| 27 | //reg5A[0]: self-clearing reg update flag |
---|
| 28 | parameter ADDR2 = 7'h5A; |
---|
| 29 | parameter DATA2 = 8'b0000_0001; |
---|
| 30 | |
---|
| 31 | reg [0:2] cnt_reg = 3'h0; |
---|
| 32 | reg [0:4] cnt_bit = 5'h0; |
---|
| 33 | reg [0:3] cnt_clk_en = 4'h0; |
---|
| 34 | |
---|
| 35 | wire done; |
---|
| 36 | |
---|
| 37 | wire clk_en; |
---|
| 38 | assign clk_en = (cnt_clk_en == 4'hf); |
---|
| 39 | |
---|
| 40 | reg [0:24*3-1] spi_shift_reg = {9'b0, ADDR0, DATA0, 9'b0, ADDR1, DATA1, 9'b0, ADDR2, DATA2}; |
---|
| 41 | //reg [0:24*3-1] spi_shift_reg = {24'h800001, 24'h800001, 24'h800001};//sim test vector |
---|
| 42 | //reg [0:24*3-1] spi_shift_reg = {24'h800002, 24'h800003, 24'h800004};//sim test vector |
---|
| 43 | |
---|
| 44 | always @(posedge clk) begin |
---|
| 45 | |
---|
| 46 | if(!done & clk_en) begin |
---|
| 47 | |
---|
| 48 | cnt_bit <= cnt_bit + 1; |
---|
| 49 | |
---|
| 50 | if(cnt_bit == 5'h1f) begin |
---|
| 51 | cnt_bit <= 5'h00; |
---|
| 52 | cnt_reg <= cnt_reg + 1; |
---|
| 53 | end |
---|
| 54 | |
---|
| 55 | if( (cnt_bit >= 4) && (cnt_bit < 28) ) begin |
---|
| 56 | spi_csn <= 1'b0; |
---|
| 57 | end |
---|
| 58 | else begin |
---|
| 59 | spi_csn <= 1'b1; |
---|
| 60 | end |
---|
| 61 | |
---|
| 62 | if( (cnt_bit > 4) && (cnt_bit <= 28) ) begin |
---|
| 63 | spi_shift_reg[0:24*NUM_REGS-1] <= {spi_shift_reg[1:24*NUM_REGS-1], 1'b0}; |
---|
| 64 | end |
---|
| 65 | else begin |
---|
| 66 | spi_shift_reg <= spi_shift_reg; |
---|
| 67 | end |
---|
| 68 | end |
---|
| 69 | end |
---|
| 70 | |
---|
| 71 | assign done = ((cnt_bit == 5'h1f) && (cnt_reg == NUM_REGS-1)); |
---|
| 72 | |
---|
[1898] | 73 | //assign spi_mosi = (cnt_bit == 16 && cnt_reg == 0) ? (~clk_src_sel) : spi_shift_reg[0]; |
---|
[1899] | 74 | assign spi_mosi = (cnt_bit == 28 && cnt_reg == 0) ? (clk_src_sel) : spi_shift_reg[0]; |
---|
[1885] | 75 | assign spi_sclk = cnt_clk_en[0]; |
---|
| 76 | assign spi_running = (!done) || (cnt_reg==5'h0); |
---|
| 77 | |
---|
| 78 | always @(posedge clk) begin |
---|
| 79 | if(!done) |
---|
| 80 | cnt_clk_en = cnt_clk_en + 1; |
---|
| 81 | end |
---|
| 82 | |
---|
| 83 | endmodule |
---|