risc-v中文社区

 找回密码
 立即注册
查看: 1039|回复: 0

[原创] chisel使用并行输出的移位寄存器

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-20 09:45:52 | 显示全部楼层 |阅读模式
常用的串口,接收时是按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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-4 18:46 , Processed in 0.016553 second(s), 18 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表