Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Xilinx Spartan 6
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Alexander_92
Кто знает, подскажите, пожалуйста, как на отладочной плате Xilinx Spartan 6 задействовать аудио порты ? Какими командами или еще как.
Делаю цифровой фильтр, а он работает с дискретными значениями, необходимо через АЦП/ЦАП пропускать сигналы. Спасибо !!! Может простенький пример есть, да сбросьте сюда.
Golikov A.
на совершенно любой отладочной плате? вы бы хоть написали что за плата...

из общих соображений обычно надо модуль написать что ЦАПом управляет... не помню я в спартане 6 стандартной периферии аудио портwink.gif
Alexander_92
Цитата(Golikov A. @ Aug 4 2015, 08:24) *
на совершенно любой отладочной плате? вы бы хоть написали что за плата...

из общих соображений обычно надо модуль написать что ЦАПом управляет... не помню я в спартане 6 стандартной периферии аудио портwink.gif


http://www.digilentinc.com/Products/Detail...2F40873A3BAA2F6

на вот эту, но мне бы кусочек кода на Veriloge, где понятно, как оно включается ))
likeasm
Если я правильно понял, вам нужен контроллер для AC97 кодека. На opencores.org таковой лежит, нужно зарегистрироваться, скачать. С другой стороны разработчики отладочной платы, обычно, поставляют свое творенье с ПО для периферии.
Alexander_92
Цитата(likeasm @ Aug 4 2015, 21:08) *
Если я правильно понял, вам нужен контроллер для AC97 кодека. На opencores.org таковой лежит, нужно зарегистрироваться, скачать. С другой стороны разработчики отладочной платы, обычно, поставляют свое творенье с ПО для периферии.


Вот я нашёл, если есть у кого время, помогите разобраться с кодом, вроде синтаксис понимаю, но что это в железе не представляю.
То есть у этого модуля по идее есть входы и выходы, но куда необходимо подключать вход/выход цифрового фильтра именно к этому контроллеру?
Фильтр работает с дискретными значениями. Пожалуйста, объясните, как происходит управление ? Как только ПЛИСка прошьётся, то аудиопорты должны реагировать на входящий сигнал, если я подключу генератор, например. help.gif

`timescale 1ns / 1ps

module ac97_controller(
input SYSCLK, // up to 125MHz
input SYSTEM_RESET, // active on 1
input BIT_CLK, // 12,288 MHz
input SDATA_IN,
output SYNC,
output SDATA_OUT,
output RESET,
output DONE,
input [15:0] Slot0_in,
input [19:0] Slot1_in,
input [19:0] Slot2_in,
input [19:0] Slot3_in,
input [19:0] Slot4_in,
input [19:0] Slot5_in,
input [19:0] Slot6_in,
input [19:0] Slot7_in,
input [19:0] Slot8_in,
input [19:0] Slot9_in,
input [19:0] Slot10_in,
input [19:0] Slot11_in,
input [19:0] Slot12_in,
output reg [15:0] Slot0_out,
output reg [19:0] Slot1_out,
output reg [19:0] Slot2_out,
output reg [19:0] Slot3_out,
output reg [19:0] Slot4_out,
output reg [19:0] Slot5_out,
output reg [19:0] Slot6_out,
output reg [19:0] Slot7_out,
output reg [19:0] Slot8_out,
output reg [19:0] Slot9_out,
output reg [19:0] Slot10_out,
output reg [19:0] Slot11_out,
output reg [19:0] Slot12_out
);

parameter START_DELAY = 17'd131000;
parameter WAIT_FOR_BITCLK_DELAY = 2'b11;

// the states of the state machine
parameter Idle = 2'b00,
Load = 2'b01, // SlotS_out are loaded from Data_reg_in and Data_reg_out is loaded with SlotS_in
Send = 2'b10, // Registers are shifted
Wait_until_Start = 2'b11; // Lines 67-70 & 130


reg [9:0] Increment = 0; // integer Incremented is used for the bit count of a 256-bit frame, as well as SYNC's frequency
reg [16:0] Var_start = 0; // incremented varialbe used to set the signal RESET at the start
reg Reset_Ready;
reg [1:0] Wait_for_BITCLK = 0;
reg [2:0] Frame_Done_reg = 0;


reg [255:0] Data_reg_out = 0;
reg [255:0] Data_reg_in = 0;

reg [1:0] StC = Idle;
reg [1:0] StN = Idle;


// If SYSTEM_RESET is 1, Var_start (used to count until RESET is deasserted to 1) is reset to 0
always @ (posedge SYSCLK)
if (SYSTEM_RESET)
Var_start <= 0;
else if (Var_start == START_DELAY)
Var_start <= Var_start;
else
Var_start <= Var_start + 1;


always @ (posedge BIT_CLK)
if (!Reset_Ready)
Wait_for_BITCLK <= 0;
else if (Wait_for_BITCLK == WAIT_FOR_BITCLK_DELAY)
Wait_for_BITCLK <= Wait_for_BITCLK;
else
Wait_for_BITCLK <= Wait_for_BITCLK + 1;


// RESET is 0 until the start delay is over
assign RESET = (Var_start == START_DELAY) ? 1:0;

always @ (posedge BIT_CLK)
Reset_Ready <= (Var_start == START_DELAY) ? 1:0;


// DONE
always @ (posedge SYSCLK)
if (StC != Load)
Frame_Done_reg <= 0;
else
Frame_Done_reg <= {Frame_Done_reg[1:0], 1'b1};

assign DONE = (Frame_Done_reg[0]&Frame_Done_reg[1]&~(Frame_Done_reg[2])) ? 1:0;


// Increment is incremeneted to 256 and then set to 1. Increment is reset to 0 only when a RESET occurs
always @ (posedge BIT_CLK)
if (StC == Idle)
Increment <= 0;
else if ((StN == Load) || (StN == Send))
if (Increment == 256)
Increment <= 1;
else
Increment <= Increment +1 ;


// SYNC will have (12,288MHz / 256) = 48KHz frequency & 20.8us period. SYNC is active while Slot0 is being sent only = for 16 BIT_CLKs
assign SYNC = (((Increment < 16)&&(Increment > 0)) || (StN == Load)) ? 1:0;


// Saving the data from SDATA_IN into Data_reg_in & cleaning Data_reg_in if a reset occurs. Data_reg_in must be shifted during the Load stat as well
always @ (posedge BIT_CLK)
if (Var_start < START_DELAY - 1)
Data_reg_in <= 0;
else
Data_reg_in[255:0] <= {Data_reg_in[254:0], SDATA_IN};


// Data_reg_out being loaded with a new frame and shifted each BIT_CLK to be sent on SDATA_OUT
always @ (posedge BIT_CLK)
if (StN == Load)
Data_reg_out <= {Slot0_in, Slot1_in, Slot2_in, Slot3_in, Slot4_in, Slot5_in, Slot6_in, Slot7_in, Slot8_in, Slot9_in, Slot10_in, Slot11_in, Slot12_in};
else
Data_reg_out [255:0] <= {Data_reg_out[254:0], 1'b0};


// State machine
always @ (posedge BIT_CLK or posedge SYSTEM_RESET)
if (SYSTEM_RESET)
StC <= Idle;
else
StC <= StN;

always @ *
begin
StN <= StC;
case (StC)
Idle: if ((!SYSTEM_RESET) && (Wait_for_BITCLK == WAIT_FOR_BITCLK_DELAY)) StN <= Wait_until_Start;

Wait_until_Start: if (Reset_Ready) StN <= Load;

Load: StN <= Send;

Send: if (Increment == 256) StN <= Load;

default: StN <= Idle;
endcase
end

assign SDATA_OUT = Data_reg_out[255];

always @ (posedge SYSCLK) begin
if (StC == Load)
begin
Slot0_out <= Data_reg_in[255:240];
Slot1_out <= Data_reg_in[239:220];
Slot2_out <= Data_reg_in[219:200];
Slot3_out <= Data_reg_in[199:180];
Slot4_out <= Data_reg_in[179:160];
Slot5_out <= Data_reg_in[159:140];
Slot6_out <= Data_reg_in[139:120];
Slot7_out <= Data_reg_in[119:100];
Slot8_out <= Data_reg_in[99:80];
Slot9_out <= Data_reg_in[79:60];
Slot10_out <= Data_reg_in[59:40];
Slot11_out <= Data_reg_in[39:20];
Slot12_out <= Data_reg_in[19:0];
end
end

endmodule
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.