本帖最后由 feihufuture 于 2020-8-21 15:41 编辑
[payamount]1.00[/payamount]
[pay]- `timescale 1ns / 1ps
- //**********************************************************
- //**********************************************************
- //(1)VO = (NUM/256)*REF*(1+RNG).
- //(2)data format : A1 A0 RNG D7 D6 D5 D4 D3 D2 D1 D0.
- //(3)With LOAD high, data is clocked into the DATA terminal
- //on each falling edge of CLK.
- //(4)Once all data bits have been clocked in, LOAD is pulsed
- //low to transfer the data from the serial-input register
- //to the selected DAC.
- //**********************************************************
- //**********************************************************
- module DA4_TLV5620(
- input CLK50M,
- input RST_N,
- //
- output DAC_CLK,
- output DAC_DATA,
- output DAC_LOAD_N,
- output DAC_LDAC_N,
- //
- input DAC_VALID,
- input [31 : 0] PC_DATA_DAC,
- output DAC_DONE
- );
- reg [5:0] div_cnt_50 = 6'b0;
- reg clk1m = 1'b0;
- reg dac_done_o = 1'b0;
- reg send_state = 1'b0;
- reg [5:0] send_cnt = 6'b0;
- reg [31:0] dac_data_reg = 32'b0;
- reg dac_load_n_o = 1'b1;
- reg dac_ldac_n_o = 1'b1;
- reg dac_clk_sel = 1'b0;
- reg dac_data_o = 1'b0;
- //**********************************************************
- //generate 1M clock
- //**********************************************************
- always [url=home.php?mod=space&uid=72445]@[/url] (posedge CLK50M)
- begin
- if(~RST_N) div_cnt_50 <= 6'b0;
- else if(div_cnt_50 == 6'd49) div_cnt_50 <= 6'b0;
- else div_cnt_50 <= div_cnt_50 + 1;
- end
- //
- always [url=home.php?mod=space&uid=72445]@[/url] (posedge CLK50M)
- begin
- if(~RST_N) clk1m <= 1'b0;
- else if(div_cnt_50 == 6'd24) clk1m <= ~clk1m;
- else if(div_cnt_50 == 6'd49) clk1m <= ~clk1m;
- else clk1m <= clk1m;
- end
- //**********************************************************
- //generate DAC_DONE
- //**********************************************************
- assign DAC_DONE = dac_done_o;
- always [url=home.php?mod=space&uid=72445]@[/url] (posedge clk1m)
- begin
- if(~RST_N) dac_done_o <= 1'b0;
- else if(dac_done_o) dac_done_o <= 1'b0;
- else if(~send_state)
- begin
- if(DAC_VALID) dac_done_o <= 1'b1;
- else dac_done_o <= 1'b0;
- end
- else dac_done_o <= 1'b0;
- end
- //**********************************************************
- //generate send_state
- //**********************************************************
- always [url=home.php?mod=space&uid=72445]@[/url] (posedge clk1m)
- begin
- if(~RST_N) send_state <= 1'b0;
- else if(send_cnt == 6'd50) send_state <= 1'b0;
- else if(~send_state)
- begin
- if(DAC_VALID) send_state <= 1'b1;
- else send_state <= send_state;
- end
- else send_state <= send_state;
- end
- //**********************************************************
- //generate send_cnt
- //**********************************************************
- always [url=home.php?mod=space&uid=72445]@[/url] (posedge clk1m)
- begin
- if(~RST_N) send_cnt <= 6'b0;
- else if(send_cnt == 6'd50) send_cnt <= 6'b0;
- else if(send_state) send_cnt <= send_cnt + 1;
- end
- //**********************************************************
- //DAC data register
- //**********************************************************
- always [url=home.php?mod=space&uid=72445]@[/url] (posedge clk1m)
- begin
- if(~RST_N) dac_data_reg <= 32'b0;
- else if(~send_state)
- begin
- if(DAC_VALID) dac_data_reg <= PC_DATA_DAC;
- else dac_data_reg <= dac_data_reg;
- end
- else dac_data_reg <= dac_data_reg;
- end
- //**********************************************************
- //DAC_LOAD_N
- //**********************************************************
- assign DAC_LOAD_N = dac_load_n_o;
- always [url=home.php?mod=space&uid=72445]@[/url] (posedge clk1m)
- begin
- if(~RST_N) dac_load_n_o <= 1'b1;
- else
- case(send_cnt)
- 6'd12: dac_load_n_o <= 1'b0;
- 6'd24: dac_load_n_o <= 1'b0;
- 6'd36: dac_load_n_o <= 1'b0;
- 6'd48: dac_load_n_o <= 1'b0;
- default: dac_load_n_o <= 1'b1;
- endcase
- end
- //**********************************************************
- //DAC_LDAC_N
- //**********************************************************
- assign DAC_LDAC_N = dac_ldac_n_o;
- always @ (posedge clk1m)
- begin
- if(~RST_N) dac_ldac_n_o <= 1'b1;
- else
- case(send_cnt)
- 6'd50: dac_ldac_n_o <= 1'b0;
- default: dac_ldac_n_o <= 1'b1;
- endcase
- end
- //**********************************************************
- //DAC_CLK
- //**********************************************************
- assign DAC_CLK = clk1m & dac_clk_sel;
- always @ (posedge clk1m)
- begin
- if(~RST_N) dac_clk_sel <= 1'b0;
- else
- case(send_cnt)
- //DAC1
- 6'd1: dac_clk_sel <= 1'b1;
- 6'd12: dac_clk_sel <= 1'b0;
- //DAC2
- 6'd13: dac_clk_sel <= 1'b1;
- 6'd24: dac_clk_sel <= 1'b0;
- //DAC3
- 6'd25: dac_clk_sel <= 1'b1;
- 6'd36: dac_clk_sel <= 1'b0;
- //DAC4
- 6'd37: dac_clk_sel <= 1'b1;
- 6'd48: dac_clk_sel <= 1'b0;
- //
- default: dac_clk_sel <= dac_clk_sel;
- endcase
- end
- //**********************************************************
- //DAC data send
- //RNG is selected '1'
- //**********************************************************
- assign DAC_DATA = dac_data_o;
- always @ (posedge clk1m)
- begin
- if(~RST_N) dac_data_o <= 1'b0;
- else
- case(send_cnt)
- //DAC1
- 6'd1:dac_data_o <= 1'b0;
- 6'd2:dac_data_o <= 1'b0;
- 6'd3:dac_data_o <= 1'b1;
- 6'd4:dac_data_o <= dac_data_reg[7];
- 6'd5:dac_data_o <= dac_data_reg[6];
- 6'd6:dac_data_o <= dac_data_reg[5];
- 6'd7:dac_data_o <= dac_data_reg[4];
- 6'd8:dac_data_o <= dac_data_reg[3];
- 6'd9:dac_data_o <= dac_data_reg[2];
- 6'd10:dac_data_o <= dac_data_reg[1];
- 6'd11:dac_data_o <= dac_data_reg[0];
- //DAC2
- 6'd13:dac_data_o <= 1'b0;
- 6'd14:dac_data_o <= 1'b1;
- 6'd15:dac_data_o <= 1'b1;
- 6'd16:dac_data_o <= dac_data_reg[15];
- 6'd17:dac_data_o <= dac_data_reg[14];
- 6'd18:dac_data_o <= dac_data_reg[13];
- 6'd19:dac_data_o <= dac_data_reg[12];
- 6'd20:dac_data_o <= dac_data_reg[11];
- 6'd21:dac_data_o <= dac_data_reg[10];
- 6'd22:dac_data_o <= dac_data_reg[9];
- 6'd23:dac_data_o <= dac_data_reg[8];
- //DAC3
- 6'd25:dac_data_o <= 1'b1;
- 6'd26:dac_data_o <= 1'b0;
- 6'd27:dac_data_o <= 1'b1;
- 6'd28:dac_data_o <= dac_data_reg[23];
- 6'd29:dac_data_o <= dac_data_reg[22];
- 6'd30:dac_data_o <= dac_data_reg[21];
- 6'd31:dac_data_o <= dac_data_reg[20];
- 6'd32:dac_data_o <= dac_data_reg[19];
- 6'd33:dac_data_o <= dac_data_reg[18];
- 6'd34:dac_data_o <= dac_data_reg[17];
- 6'd35:dac_data_o <= dac_data_reg[16];
- //DAC4
- 6'd37:dac_data_o <= 1'b1;
- 6'd38:dac_data_o <= 1'b1;
- 6'd39:dac_data_o <= 1'b1;
- 6'd40:dac_data_o <= dac_data_reg[31];
- 6'd41:dac_data_o <= dac_data_reg[30];
- 6'd42:dac_data_o <= dac_data_reg[29];
- 6'd43:dac_data_o <= dac_data_reg[28];
- 6'd44:dac_data_o <= dac_data_reg[27];
- 6'd45:dac_data_o <= dac_data_reg[26];
- 6'd46:dac_data_o <= dac_data_reg[25];
- 6'd47:dac_data_o <= dac_data_reg[24];
- //
- default: dac_data_o <= 1'b0;
- endcase
- end
-
-
- endmodule
-
-
-
-
-
-
[/pay]
|