Add files via upload
This commit is contained in:
@@ -0,0 +1,253 @@
|
||||
module fpga_controller (
|
||||
input wire CLK_IN, // 100MHz input clock
|
||||
input wire DIG_0, // Control signal
|
||||
input wire DIG_1, //reset from µC
|
||||
input wire [7:0] ADC_DATA, // 8-bit data from ADC
|
||||
output wire DAC_CLOCK, // Clock for DAC
|
||||
output reg [7:0] DAC_DATA, // Data to DAC
|
||||
output reg [7:0] FT_DATA, // Data to FT2232H
|
||||
output reg FT_WR, // Write control for FT2232H
|
||||
input FT_TXE,
|
||||
input wire FT_CLKOUT,
|
||||
output reg FT_OE,
|
||||
output reg FT_RD
|
||||
);
|
||||
|
||||
// Clock generation (assumes DAC needs 120MHz, adjust if needed)
|
||||
reg [2:0] clk_div = 0;
|
||||
reg dac_clk_reg = 0;
|
||||
always @(posedge CLK_IN) begin
|
||||
clk_div <= clk_div + 1;
|
||||
if (clk_div == 2) begin
|
||||
dac_clk_reg <= ~dac_clk_reg;
|
||||
clk_div <= 0;
|
||||
end
|
||||
end
|
||||
assign DAC_CLOCK = dac_clk_reg;
|
||||
|
||||
// Instantiate waveform generator
|
||||
waveform_generator waveform_gen (
|
||||
.CLK_IN(CLK_IN),
|
||||
.DAC_CLOCK(DAC_CLOCK),
|
||||
.DAC_DATA(DAC_DATA)
|
||||
);
|
||||
|
||||
// Instantiate ADC interface
|
||||
wire [7:0] adc_output;
|
||||
adc_interface adc_intf (
|
||||
.CLK_IN(CLK_IN),
|
||||
.ADC_DATA(adc_output)
|
||||
);
|
||||
|
||||
// Instantiate FIFO for FT2232H data buffering
|
||||
ft2232h_245_sync ft2232h_245_sync (
|
||||
.clk,//input 50_MHz
|
||||
.reset,
|
||||
.DAC_DATA,
|
||||
.AD_Bus,
|
||||
.oe,
|
||||
.rd,
|
||||
.txe,
|
||||
.wr,
|
||||
.clkout_ft2232
|
||||
);
|
||||
|
||||
// Data handling logic
|
||||
always @(posedge CLK_IN) begin
|
||||
if (!DIG_0) begin
|
||||
FT_DATA <= fifo_out; // Send ADC data to FT2232H
|
||||
FT_WR <= ~fifo_empty; // Write when FIFO is not empty
|
||||
end else begin
|
||||
FT_WR <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
// Waveform Generator Module
|
||||
module waveform_generator (
|
||||
input wire CLK_IN,
|
||||
output reg DAC_CLOCK,
|
||||
output reg [7:0] DAC_DATA
|
||||
);
|
||||
reg [2:0] clk_div = 0;
|
||||
always @(posedge CLK_IN) begin
|
||||
clk_div <= clk_div + 1;
|
||||
if (clk_div == 2) begin
|
||||
DAC_CLOCK <= ~DAC_CLOCK;
|
||||
clk_div <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
parameter integer n = 31;
|
||||
reg [7:0] waveform_LUT [0:n-1];
|
||||
initial begin
|
||||
waveform_LUT[0] = 8'h80; waveform_LUT[1] = 8'h89;
|
||||
waveform_LUT[2] = 8'h99; waveform_LUT[3] = 8'hAE;
|
||||
waveform_LUT[4] = 8'hC7; waveform_LUT[5] = 8'hE1;
|
||||
waveform_LUT[6] = 8'hF6; waveform_LUT[7] = 8'hFF;
|
||||
waveform_LUT[8] = 8'hF4; waveform_LUT[9] = 8'hCF;
|
||||
waveform_LUT[10] = 8'h92; waveform_LUT[11] = 8'h4B;
|
||||
waveform_LUT[12] = 8'h11; waveform_LUT[13] = 8'h02;
|
||||
waveform_LUT[14] = 8'h2E; waveform_LUT[15] = 8'h8A;
|
||||
waveform_LUT[16] = 8'hE4; waveform_LUT[17] = 8'hFC;
|
||||
waveform_LUT[18] = 8'hB6; waveform_LUT[19] = 8'h3F;
|
||||
waveform_LUT[20] = 8'h00; waveform_LUT[21] = 8'h41;
|
||||
waveform_LUT[22] = 8'hC8; waveform_LUT[23] = 8'hFC;
|
||||
waveform_LUT[24] = 8'h91; waveform_LUT[25] = 8'h0C;
|
||||
waveform_LUT[26] = 8'h2E; waveform_LUT[27] = 8'hD0;
|
||||
waveform_LUT[28] = 8'hED; waveform_LUT[29] = 8'h4A;
|
||||
waveform_LUT[30] = 8'h09;
|
||||
end
|
||||
|
||||
reg [9:0] index = 0;
|
||||
always @(posedge DAC_CLOCK) begin
|
||||
DAC_DATA <= waveform_LUT[index];
|
||||
index <= (index >= n - 1) ? 0 : index + 1;
|
||||
end
|
||||
endmodule
|
||||
|
||||
// ADC Interface Module
|
||||
module adc_interface (
|
||||
input wire CLK_IN,
|
||||
output reg [7:0] ADC_DATA
|
||||
);
|
||||
always @(posedge CLK_IN) begin
|
||||
ADC_DATA <= $random; // Simulate ADC data
|
||||
end
|
||||
endmodule
|
||||
|
||||
// FIFO Transmitter Module
|
||||
module ft2232h_245_sync(input clk,//input 50_MHz
|
||||
input reset,
|
||||
input [7:0] DAC_DATA,
|
||||
input [7:0] AD_Bus,
|
||||
output reg oe,
|
||||
output reg rd,
|
||||
input txe,
|
||||
output reg wr,
|
||||
input clkout_ft2232);
|
||||
//output reg oe);
|
||||
|
||||
//wire CLK_OUT_PLL; //Output from PLL_IP_clock
|
||||
|
||||
|
||||
reg txe_n;
|
||||
reg wr_n;
|
||||
|
||||
reg oe_n = 1'b1;
|
||||
reg rd_n = 1'b1;
|
||||
|
||||
reg Flag_tx = 0;
|
||||
|
||||
reg data_en_1 = 0;
|
||||
reg data_en_2 = 0;
|
||||
|
||||
reg [7:0] data_o = 8'b00000000;
|
||||
|
||||
|
||||
parameter TX_RX_0 = 3'b000;
|
||||
parameter TX_1 = 3'b001;
|
||||
parameter TX_2 = 3'b010;
|
||||
parameter TX_3 = 3'b011;
|
||||
|
||||
reg [3:0] state;
|
||||
|
||||
reg [3:0] state_data;
|
||||
|
||||
reg counter = 1'b0;
|
||||
|
||||
begin
|
||||
|
||||
assign AD_Bus = (data_en_1 == 1'b1) ? DAC_DATA : 8'bz;
|
||||
|
||||
always @ (posedge clkout_ft2232)
|
||||
begin
|
||||
if ((txe_n == 0) && Flag_tx)
|
||||
begin
|
||||
data_en_1 = 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
always @ (posedge clk)
|
||||
begin
|
||||
wr = wr_n;
|
||||
txe_n = txe;
|
||||
oe = oe_n;
|
||||
rd = rd_n;
|
||||
end
|
||||
|
||||
always @ (posedge clk)
|
||||
if (reset)
|
||||
begin
|
||||
state = TX_RX_0;
|
||||
state_data = 0;
|
||||
counter = 1'b0;
|
||||
wr_n = 1'b1;
|
||||
end
|
||||
else
|
||||
|
||||
begin
|
||||
|
||||
|
||||
case(state)
|
||||
|
||||
TX_RX_0: begin
|
||||
if (txe_n == 0)
|
||||
begin
|
||||
state = TX_1;
|
||||
end
|
||||
else
|
||||
begin
|
||||
state = TX_RX_0;
|
||||
wr_n = 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
TX_1 : begin
|
||||
if(txe_n == 0)
|
||||
begin
|
||||
counter = counter + 1;
|
||||
if(counter == 1'b1)
|
||||
begin
|
||||
counter = 1'b0;
|
||||
state = TX_2;
|
||||
end
|
||||
end
|
||||
else
|
||||
begin
|
||||
wr_n = 1'b1;
|
||||
state = TX_RX_0;
|
||||
end
|
||||
end
|
||||
|
||||
TX_2 : begin
|
||||
wr_n = 1'b0;
|
||||
counter = counter + 1;
|
||||
if(counter == 1'b1)
|
||||
begin
|
||||
counter = 1'b0;
|
||||
state = TX_3;
|
||||
end
|
||||
end
|
||||
|
||||
TX_3 : begin
|
||||
if(txe_n == 0)
|
||||
begin
|
||||
Flag_tx = 1'b1;
|
||||
state = TX_3;
|
||||
end
|
||||
else
|
||||
begin
|
||||
state = TX_RX_0;
|
||||
wr_n = 1'b1;
|
||||
Flag_tx = 1'b0;
|
||||
end
|
||||
end
|
||||
|
||||
endcase
|
||||
end
|
||||
end
|
||||
endmodule
|
||||
|
||||
Reference in New Issue
Block a user