пока вот что получилось:
module epm3064(OUT,WR,RESET,RD,CS,DAT,A,D);
input wire [3:0] A;
input wire [7:0] D;
input wire WR, RD, CS, RESET;
inout [7:0] DAT;
inout [8:1] OUT;
output reg [8:1] OUT;
reg [8:1] INREG;


Тут хорошо идёт С-шная тернарная операция ?:Nevox писал(а): DAT0 = TRI(D0,!CS&!RD); % сигнал с выхода трехразрядного буфера TRI подается на I/O порт %
...
DAT7 = TRI(D7,!CS&!RD);
Код: Выделить всё
assign DAT = !CS && !RD ? D : 8bz; Тут posedge WR если запись в регистр по фронту WR. По фрагменту AHDL получается, что запись по спаду, так что negedge. Сброс низким уровнем на RESETNevox писал(а): % соединение порта D защелок с DAT[]&RESET %
IN_REG[8..1].D = DAT[7..0]; % соединения выполняются одновременно %
IN_REG[].CLK = LCELL(!WR);
IN_REG[8..1].ENA = (!CS&(A[]==8));
IN_REG[].CLRN = LCELL(RESET);
Код: Выделить всё
always @(negedge WR or negedge RESET)
begin
if (RESET == 0)
INREG <= 0;
else if (!CS && A == 8)
INREG <= DAT;
endКод: Выделить всё
wire [7:0] D;
assign D = A[3:0] == 0 ? 8'd32 :
A[3:0] == 1 ? 8'd28 :
A[3:0] == 2 ? 8'd8 :
A[3:0] == 3 ? 8'd8 :
A[3:0] == 4 ? 0 :
A[3:0] == 5 ? 0 :
A[3:0] == 6 ? 0 :
A[3:0] == 7 ? 0 :
A[3:0] == 8 ? IN_REG :
0; // но ведь в оставшихся случаях тоже 0, зачем в исходном для 4..7 отдельно было?
Код: Выделить всё
reg [7:0] D_reg;
assign D = D_reg; // ну или тут тоже через ?: третье состояние врезать или что другое
// Или сразу объявить D регистром, триггера тут не будет, если не забіть про
// default. Если забыть, получится LATCH
always @(*)
case (A[3:0])
0: D_reg = 8'd32;
1: D_reg = 8'd28;
2: D_reg = 8'd8;
3: D_reg = 8'd8;
8: D_reg = IN_REG;
default: D_reg = 0;
endcaseесли нужно всю шину перевести в Z то наверное правильнее написатьNevox писал(а): assign DAT[7:0]=(!CS&!RD)?D[7:0]:8'bz;
assign OUT[8:1]=(INREG[8:1])?0:8'bz;
т.е. 8'bZ0 даст 8'bZZZZZZZ0, 8'b10 даст 8'b00000010Std 1364-2001 писал(а):2.5.1 Integer constants
If the size of the unsigned number is smaller than the size specified for the constant, the unsigned number shall be padded to the left with zeros. If the leftmost bit in the unsigned number is an x or a z, then an x or a z shall be used to pad to the left respectively.
Код: Выделить всё
always @(negedge WR or negedge RESET)
if (!RESET)
IN_REG <= 0;
else if (!CS) begin
if (A == 8) IN_REG[ 7:0] <= DAT;
if (A == 9) IN_REG[13:8] <= DAT[5:0];
endКод: Выделить всё
D[7..0] = (32&(A[3..0]==0))#
(23&(A[3..0]==1))#
(14&(A[3..0]==2))#
(8&(A[3..0]==3))#
(10&(A[3..0]==4))#
(0&(A[3..0]==5))#
(0&(A[3..0]==6))#
(0&(A[3..0]==7))#
(IN_REG[7..0]&(A[3..0]==8))#
((gnd,gnd,IN_REG[13..8])&(A[3..0]==9))#
((gnd,gnd,gnd,gnd,CTR,gnd,gnd,vcc)&(A[3..0]==11));Код: Выделить всё
TABLE
opt_hdiv[] => hdmod[];
B"11" => HDMOD_100ms;
B"10" => HDMOD_150ms;
B"01" => HDMOD_200ms;
B"00" => HDMOD_300ms;
END TABLE;Код: Выделить всё
sequ.(clk,reset) = (Clk,Reset);
CASE sequ IS
WHEN Idle =>
IF CyReq THEN sequ = CYras;
ELSIF RefEn & RefReq THEN sequ = RFcas;
ELSE sequ = Idle;
END IF;
WHEN CYras => sequ = CYmux;
WHEN CYmux => sequ = CYcas;
...Код: Выделить всё
SUBDESIGN 16OUT
(
WR : INPUT;
RD : INPUT;
CS : INPUT;
DAT[7..0]: BIDIR;
A[3..0] : INPUT;
IN[15..0]: INPUT;
)
VARIABLE
D[7..0] : NODE;
BEGIN
D[7..0] = (16&(A[3..0]==0))#
(33&(A[3..0]==1))#
(16&(A[3..0]==2))#
(8&(A[3..0]==3))#
(0&(A[3..0]==4))#
(0&(A[3..0]==5))#
(0&(A[3..0]==6))#
(0&(A[3..0]==7))#
(IN[7..0]&(A[3..0]==8))#
(IN[15..8]&(A[3..0]==9));
DAT0 = TRI(D0,!CS&!RD);
DAT1 = TRI(D1,!CS&!RD);
DAT2 = TRI(D2,!CS&!RD);
DAT3 = TRI(D3,!CS&!RD);
DAT4 = TRI(D4,!CS&!RD);
DAT5 = TRI(D5,!CS&!RD);
DAT6 = TRI(D6,!CS&!RD);
DAT7 = TRI(D7,!CS&!RD);
END;
Код: Выделить всё
module SN_DVV_16_24_V (IN,WR,RD,CS,DAT,A);
input wire [3:0] A;
input wire [15:0]IN;
input wire WR, RD, CS;
inout [7:0] DAT;
reg [7:0] D;
assign DAT[7:0]=(!CS&!RD)?D[7:0]:8'bz;
always @(negedge RD)
case (A)
4'b0000: D = 8'b00010000;
4'b0001: D = 8'b00100001;
4'b0010: D = 8'b00010000;
4'b0011: D = 8'b00001000;
4'b1000: D = IN[7:0];
4'b1010: D = IN[15:8];
default: D = 8'b00000000;
endcase
endmoduleКод: Выделить всё
always @(*) // * - любое изменение любого сигнала
case (A)
4'b0000: D = 8'b00010000;
4'b0001: D = 8'b00100001;
4'b0010: D = 8'b00010000;
4'b0011: D = 8'b00001000;
4'b1000: D = IN[7:0];
4'b1010: D = IN[15:8];
default: D = 8'b00000000;
endcase Код: Выделить всё
SUBDESIGN SN_DVV_14_220V
(
RES, INT : INPUT;
WR : INPUT;
RD : INPUT;
CS : INPUT;
DAT[7..0]: BIDIR;
A[3..0] : INPUT;
IN[13..0]: INPUT;
)
VARIABLE
D[7..0] : NODE;
BEGIN
D[7..0] = (16&(A[3..0]==0))#
(35&(A[3..0]==1))#
(14&(A[3..0]==2))#
(8&(A[3..0]==3))#
(0&(A[3..0]==4))#
(0&(A[3..0]==5))#
(0&(A[3..0]==6))#
(0&(A[3..0]==7))#
(IN[7..0]&(A[3..0]==8));
D[5..0] = (IN[13..8]&(A[3..0]==9));
DAT0 = TRI(D0,!CS&!RD);
DAT1 = TRI(D1,!CS&!RD);
DAT2 = TRI(D2,!CS&!RD);
DAT3 = TRI(D3,!CS&!RD);
DAT4 = TRI(D4,!CS&!RD);
DAT5 = TRI(D5,!CS&!RD);
DAT6 = TRI(D6,!CS&!RD);
DAT7 = TRI(D7,!CS&!RD);
END;