[an error occurred while processing this directive]
Ответ:
(«Телесистемы»: Конференция 'Языки описания аппаратуры (VHDL и др.))

миниатюрный аудио-видеорекордер mAVR

Отправлено SAZH 01 июня 2005 г. 11:02
В ответ на: Это просто замечательно работает, если в системме только один клок. А вот если клоков больше просто физически.... отправлено <font color=gray>Артем</font> 01 июня 2005 г. 08:14

Чудес не бывает. Если у Вас есть две асинхронные друг относительно друга системы, есть два подхода к приему передачи данных. Синхронизация по данным или по управлению. Альтера в хендбуке рекомендует по управлению. Не имеет значения сколько у Вас приемных каналов. Если есть свой глобальный клок, это все можно нанизать на него как на елку.
Например:

module in_out (global_clk, in_clk, input_data, inout_clk, out_clk, out_data);

output [7:0] out_data;
output out_clk;

input global_clk;
input [7:0] input_data;
input in_clk;
input inout_clk;

reg [7:0] out_data;
reg [7:0] in_data;
reg [1:0] sdvig_in_rg;
reg [1:0] sdvig_out_rg;

wire e_wr_rg;
wire e_rd_rg;

assign out_clk = inout_clk;

always @ (posedge global_clk)
begin
sdvig_in_rg[1:0] <= {sdvig_in_rg[0], in_clk};
sdvig_out_rg[1:0] <= {sdvig_out_rg[0], inout_clk};
end

assign e_wr_rg = sdvig_in_rg[0] & ~sdvig_in_rg[1];
assign e_rd_rg = ~sdvig_out_rg[0] & sdvig_out_rg[1];

always @ (posedge global_clk)
begin
if (e_wr_rg == 1'b1)
in_data <= input_data;
if (e_rd_rg == 1'b1)
out_data <= in_data;
end

endmodule

Причем если у Вас есть данные типа манчестер или другие, в которых закодирован несущий синхроимпульс, только так можно выделить эти данные.
Дело ведь не в синхронной или асинхронной системе. Дело в подходе к проектированию. Продуманный протокол обмена всегда гарантирует качественный прием выдачу данных. (ISA, QBUS)
Например:

module arbitraj
(
input clk,
input in_flaga, clr_flaga,
input in_flagb, clr_flagb,
output readya, ewra,
output readyb, ewrb
);

reg dff_flaga;
reg dff_flagb;
reg tffa;
reg dffe_arbitra;
reg dffe_arbitrb;

assign readya = ~ dff_flaga;
assign readyb = ~ dff_flagb;

always @(posedge clk)
begin
tffa <= tffa ^ 1'b1;
end

always @(posedge in_flaga or posedge clr_flaga)
begin
if (clr_flaga)
dff_flaga <= 1'b0;
else
dff_flaga <= 1'b1;
end

always @(posedge in_flagb or posedge clr_flagb)
begin
if (clr_flagb)
dff_flagb <= 1'b0;
else
dff_flagb <= 1'b1;
end

always @(posedge clk or posedge dffe_arbitrb)
begin
if (dffe_arbitrb)
dffe_arbitra <= 1'b0;
else if (tffa == 1'b1)
dffe_arbitra <= dff_flaga;
end

always @(posedge clk or posedge dffe_arbitra)
begin
if (dffe_arbitra)
dffe_arbitrb <= 1'b0;
else if (tffa == 1'b0)
dffe_arbitrb <= dff_flagb;
end

assign ewra = dffe_arbitra;
assign ewrb = dffe_arbitrb;

endmodule
Удачи!

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru