Add files via upload

This commit is contained in:
NawfalMotii79
2026-03-19 01:15:52 +00:00
committed by GitHub
parent ef0650b143
commit b33a9bcd37
9 changed files with 2680 additions and 0 deletions
@@ -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