[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
выбросив все кроме интерфейса - получил следующее
синтезируется вроде так как надо, но то как я описал асинхронную установку триггеров (//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: info@telesys.ru