[an error occurred while processing this directive]
|
Чудес не бывает. Если у Вас есть две асинхронные друг относительно друга системы, есть два подхода к приему передачи данных. Синхронизация по данным или по управлению. Альтера в хендбуке рекомендует по управлению. Не имеет значения сколько у Вас приемных каналов. Если есть свой глобальный клок, это все можно нанизать на него как на елку.
Например:
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: info@telesys.ru