Уже крыша едет!! В двух словах: есть набор регистров 16х256 "на улицу" + двухпортовая память для передачи данных другому модулю + вход от такой же памяти того самого модуля... Память адресуется регистрами 32 и 33, регистры с автоинкрементом. Все остальное неважно, далее код в студию... `timescale 1ms / 1us //////////////////////////////////////////////////////////////////////////////// // Create Date: 10:12:22 07/27/05 // Module Name: REG_ARM_DUAL_PORT //////////////////////////////////////////////////////////////////////////////// module REG_ARM_DUAL_PORT(A, CS_FPGA, nWR, nRD, NLB, NUB, HFCC, HFCD, DIN, DOUT, TxHALEn, RECEIVE, TOUT, MARKER, HAL_HDWL, NSS_MODE, GCLK, SHARE_A, SHARE_D, TOSHARE_A, TOSHARE_D, CS4_MEM, CS5_MEM); parameter DEEP=256; parameter MEM_DEEP=1024; input [7:0] A; input CS_FPGA; input nWR; input nRD; input NLB; input NUB; input HFCC; input [7:0] HFCD; input [15:0] DIN; input GCLK; input [10:0] SHARE_A; input [15:0] TOSHARE_D; input CS4_MEM; input CS5_MEM; output [15:0] DOUT; output TxHALEn; output RECEIVE; output [15:0] TOUT; output MARKER; output HAL_HDWL; output NSS_MODE; output [7:0] SHARE_D; output [10:0] TOSHARE_A; // Собственно регистры reg [15:0] RARM [DEEP-1:0]/* synthesis syn_ramstyle="registers"*/; reg [7:0] MEM [MEM_DEEP-1:0]/* synthesis syn_ramstyle="select_ram"*/; reg [15:0] R3; reg MARKER; wire nWR_EN; wire [10:0] A_MEM; reg nWR_MEM_C, nRD_MEM_C; assign TxHALEn = RARM[0][0]; assign NSS_MODE = RARM[0][1]; assign RECEIVE = RARM[1][0]; assign HAL_HDWL = RARM[1][2]; assign TOUT=RARM[2]; assign nWR_EN=nWR | CS_FPGA; assign TOSHARE_A=RARM[33]; assign nWR_MEM=nWR|CS4_MEM; assign nRD_MEM=nRD|CS5_MEM; assign A_MEM=RARM[32]; assign A_MEM1=RARM[33];
assign SHARE_D=MEM[SHARE_A]; // Регистр RARM3 - вход HAL Freq Control always @(posedge HFCC) R3={8'b0,HFCD};
always @(posedge GCLK) begin // Маркер if ((nWR_EN==0)&&(A==8'h02)&&(DIN!=8'h00)) MARKER=!MARKER; // Локальные регистры if (nWR_EN==0) //negedge nWR_EN RARM[A]=DIN; // Память обмена (запись) if (nWR_MEM==0) {MEM[A_MEM],MEM[A_MEM+1]}=DIN; // Автоинкремент указателей if ({nWR_MEM,nWR_MEM_C}==2'b10) //posedge nWR_MEM RARM[32]=A_MEM+2; nWR_MEM_C=nWR_MEM; if ({nRD_MEM,nRD_MEM_C}==2'b10) //posedge nRD_MEM RARM[33]=A_MEM1+2; nRD_MEM_C=nRD_MEM; end assign DOUT=((CS5_MEM==0)?TOSHARE_D:((A==3)?R3:RARM[A]));
endmodule
Так вот: при синтезе Synplify 8.2.1 просто зависает (возможно, она и не висит в прямом смысле этого слова, но я так и не дождался)... Подобная ситуация и с тем самым "другим модулем", он написан немного по другому. Он по логу проходит чуть дальше и выдает в .srr чудную ошибку: Latch generated from always block for signal MEM_1018_[7:0], probably caused by a missing assignment in an if or case stmt. И так для каждого бита памяти... Я, честно, так и не понял ее смысла... Но синтезирует его... вот только Latch-ей после этого в проекте столько, что они в ПЛИС не лезут... Ответы сводящиеся только к "я бы сделал совсем по другому" просьба не писать, либо уж пишите, как бы Вы сделали... Заранее спасибо. P.S. Думаю, это у меня ручки кривоваты, а Synplify ни при чем.
|