joe 发表于 2021-8-20 09:45:52

chisel使用并行输出的移位寄存器

常用的串口,接收时是按bit位接收,但交给mcu后面控制部分使用的时候是一个字节形式的数据,
我们还是假定上帖中的4位移位寄存器,只不过每个触发器输出还接到一个输出位Qn(假定高低位Q
的排序如图中所示)


经过4个周期,这个电路就会将一个4位的串行数据转换为一个4位的并行数据Q,
当然,如果是串口,一般会收到STOP位时表示并行数据Q有效了。
下面代码,我们使用0初始化移位寄存器outReg,然后从最高位开始移位,也就是右移,并行输出结果q:
import chisel3._
import chisel3.util._
class ShiftRegModule2 extends Module{
val io = IO(new Bundle {
    val din = Input(UInt(1.W))
    val dout = Output(UInt(1.W))
    val q = Output(UInt(4.W))
})
val shiftReg = RegInit(0.U(4.W)) //复位值为0的寄存器
shiftReg := Cat(io.din,shiftReg(3,1))
io.q := shiftReg //4bit并行输出到q
io.dout := shiftReg(3) //dout串行输出最高位
}
产生的verilog文件内容如下:
module ShiftRegModule2(
input      clock,
input      reset,
input      io_din,
output       io_dout,
output io_q
);
reg shiftReg; // @
reg _RAND_0;
wire _T_1 = {io_din,shiftReg}; // @
assign io_dout = shiftReg; // @
assign io_q = shiftReg; // @
always @(posedge clock) begin
    if (reset) begin
      shiftReg <= 4'h0;
    end else begin
      shiftReg <= _T_1;
    end
end
endmodule

页: [1]
查看完整版本: chisel使用并行输出的移位寄存器