Составители:
always @(posedge dp_clk) dp_value <= ~dp_oe ? 0 : acc[];
reg [] data; // входные данные с шины
always @(posedge dp_clk) data <= ~dp_load ? 0 : dp_data;
reg sub, init; // режимы работы
always @(posedge dp_clk) {sub,init} <= ~dp_load ? 0 : {dp_neg,dp_init};
reg [] arg; // приходится делать регистром, т.к. иначе не трассируется
reg arg_sub, arg_init;
always @(posedge dp_clk) arg <= SIGNEXT(data) ^ {(…){sub}};
always @(posedge dp_clk) {arg_sub,arg_init} <= {sub,init};
wire [] rhi = (arg_init ? 0 : {acc[HI],car}) + {arg[HI],car};
wire [] rlo = {1'b0,arg_init ? 0 : acc[LO],arg_sub} +
{1'b0,arg[LO],arg_sub};
always @(posedge dp_clk) {acc[HI],car,acc[LO]} <= {rhi[],rlo[]};
endmodule
Выделяем основные регистры и соединяем их линиями передачи данных
(рис. 2.26). Желательно расположить граф так, чтобы он начинался от шины и
заканчивался ей же.
Рис. 2.26. Структурная схема dpu_accum
Для удобства “одноранговые” группы регистров размещены на одинаковых
тактах, помеченных буквами A…D. Можно заметить, что на такте C в
рассматриваемом DPU существует цикл (новое значение такта C зависит от
предыдущего значения на том же такте).
Модель DPU требует явного выделения двух типов объектов: входных и
выходных портов. В рассматриваемом случае выделение портов может
показаться неочевидным, однако будем считать, что все входные порты
представляют собой тройку INIT/SUB/DATA (обведены жирными точками), а
выходной порт-результат – пара ACC[HI]/ACC[LO] (выделены жирной линией).
119
Страницы
- « первая
- ‹ предыдущая
- …
- 118
- 119
- 120
- 121
- 122
- …
- следующая ›
- последняя »
