|
常用的串口,接收时是按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 [3:0] io_q
);
reg [3:0] shiftReg; // @[ShiftRegModule2.scala 11:25]
reg [31:0] _RAND_0;
wire [3:0] _T_1 = {io_din,shiftReg[3:1]}; // @[Cat.scala 30:58]
assign io_dout = shiftReg[3]; // @[ShiftRegModule2.scala 14:11]
assign io_q = shiftReg; // @[ShiftRegModule2.scala 13:8]
always @(posedge clock) begin
if (reset) begin
shiftReg <= 4'h0;
end else begin
shiftReg <= _T_1;
end
end
endmodule
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|