По вашей ссылке с комментарием ScalaDo c:
/** Returns the n-cycle delayed version of the input signal.
*
* @param in input to delay
* @param n number of cycles to delay
* @param en enable the shift
*
* @example {{{
* val regDelayTwo = ShiftRegister(nextVal, 2, ena)
* }}}
*/
def apply[T <: Data](in: T, n: Int, en: Bool = true.B): T = { ...
ShiftRegister
задерживает входные данные in
, n
циклов. Это типично c относительно типа, смещаемого внутрь и наружу. Я подозреваю, что вы имеете в виду стереотипный регистр сдвига, который сдвигает и выводит 1 бит данных за цикл. Вы можете легко сделать это с помощью этой конструкции, сделав тип ввода Bool
:
class Foo extends Module {
val io = IO(new Bundle {
val in = Input(Bool())
val out = Output(Bool())
})
io.out := ShiftRegister(io.in, 4)
}
Дает
module Foo(
input clock,
input reset,
input io_in,
output io_out
);
reg _T; // @[Reg.scala 15:16]
reg [31:0] _RAND_0;
reg _T_1; // @[Reg.scala 15:16]
reg [31:0] _RAND_1;
reg _T_2; // @[Reg.scala 15:16]
reg [31:0] _RAND_2;
reg _T_3; // @[Reg.scala 15:16]
reg [31:0] _RAND_3;
assign io_out = _T_3; // @[main.scala 13:10]
// ...
always @(posedge clock) begin
_T <= io_in;
_T_1 <= _T;
_T_2 <= _T_1;
_T_3 <= _T_2;
end
endmodule
Обратите внимание, что конструкция скрывает от вас лежащие в основе флопы, она возвращает вывод последнего флопа, который является «сдвинутым значением» каждого цикла.