[an error occurred while processing this directive] [an error occurred while processing this directive]
собственно чего я нарисовал
(«Телесистемы»: Конференция «Программируемые логические схемы и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено yes 08 мая 2002 г. 11:27
В ответ на: Ответ отправлено SNN 07 мая 2002 г. 20:15

выбросив все кроме интерфейса - получил следующее

синтезируется вроде так как надо, но то как я описал асинхронную установку триггеров (//write ctrl - собственно это обсуждаемая схемка - остальное для общей картины) синтезу не нравится, то есть синтезируется, но warning-и выдаются

КАК БЫ ВЫ ОПИСАЛИ ПОДКЛЮЧЕНИЕ ШИНЫ К АСИНХРОННЫМ ВХОДАМ ТРИГГЕРОВ?

а проблему видимо придется решить запретом на последовательные обращения по одинаковым адресам

как решить ее схемотехнически я не знаю - какой бы автомат записи не поставишь - все-равно если повторное обращение произойдет в момент записи, то данные испортятся



module in(/*AUTOARG*/
// Outputs
DOUT,
// Inputs
ADDR, D, MS, RD, WR, C, RST
);

parameter rfa=1;
parameter rf=(1<<(rfa+1))-1;
parameter bw=1;

// Interface to CPU
input [rfa:0] ADDR;
input [bw:0] D;
output [bw:0] DOUT;
// all signals active HIGH
input MS,RD,WR,C,RST;

/*AUTOREG*/
// Beginning of automatic regs (for this module's undeclared outputs)
reg [bw:0] DOUT;
// End of automatics

integer i;

reg [bw:0] di [0:rf];
reg [bw:0] idi [0:rf];

reg [rf:0] wrs,wrs_ext_wr,wrs_int_wr;
wire [rf:0] wrs_wr_en=wrs_int_wr&~wrs;

wire write_access=WR&MS;
wire read_access=RD&MS;
//wire [rfa:0] iADDR=ADDR&rf;

//async bit access
wire [bw:0] actrlin=di[0];
wire pwr_on=actrlin[0];

//sync input reg names
wire [bw:0] ctrlin=idi[0];

//Write to interface latches
//ambit synthesis set_reset asynchronous signals = "RST"
always @(D or ADDR or write_access or RST)
begin : ext_latch
if(RST)
begin
for( i=0; i<=rf; i=i+1 )
di[i]<=0;
end
else if(write_access)
begin
di[ADDR]<=D;
end
end // block: ext_latch

//Power ctrl
reg pwr_nf;
always @(negedge C or posedge RST)
begin: pwr_ctrl
if (RST)
pwr_nf <= 0;
else
pwr_nf<=pwr_on;
end
wire SCLK=C&pwr_nf;

//Decode writes to second level interface ff
always @( /*AUTOSENSE*/ADDR or pwr_nf or write_access)
begin: addr_decode
if(write_access & pwr_nf)
if( &ADDR )
wrs = ~0;
else
wrs = 1 << ADDR;
else
wrs = 0;
end

//write ctrl
wire awrs=|wrs;
always @(posedge SCLK or posedge RST or posedge awrs)
begin: wr_ctrl
if(awrs)
begin
for( i=0; i<=rf; i=i+1 )
if (wrs[i])
wrs_ext_wr[i]<=1;
end
else if(RST)
begin
wrs_ext_wr<=0;
wrs_int_wr<=0;
end
else
begin
wrs_ext_wr<=0;
wrs_int_wr<=wrs_ext_wr;
end
end // block: wr_ctrl


//write to internal regs
always @(posedge SCLK or posedge RST)
begin: int_latch
if(RST)
begin
for( i=0; i<=rf; i=i+1 )
idi[i]<=0;
end
else
begin
for( i=0; i<=rf; i=i+1 )
if (wrs_wr_en[i])
idi[i]<=di[i];
end // else: !if(RST)
end // block: int_latch



/*------------------------------------------------------------------------*/
//OUTPUT BUS CONTROL
//create output
wire [bw:0] do0=idi[0];
wire [bw:0] do1=idi[1];
wire [bw:0] do2=idi[2];
wire [bw:0] do3=idi[3];
wire [bw:0] do4=idi[0];

reg [rf:0] enable;

always @(/*AUTOSENSE*/ADDR or do0 or do1 or do2 or do3 or do4 or pwr_on
or read_access)
begin
DOUT = 0;
if(read_access & pwr_on)
begin
enable = 1< if(&ADDR)
enable = ~0;
for( i=0; i<=bw; i=i+1 )
DOUT[i] = ^({do4[i],do3[i],do2[i],do1[i],do0[i]} & enable);
end
end // always @ (...
/*------------------------------------------------------------------------*/

endmodule // in



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

Ответы


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

Имя (обязательно): 
Пароль: 
E-mail: 

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

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

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


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

E-mail: info@telesys.ru