risc-v中文社区

 找回密码
 立即注册
查看: 1299|回复: 4

[原创] 使用继承方式产生硬件电路

  [复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-9-4 10:22:07 | 显示全部楼层 |阅读模式
前面介绍了几种产生硬件电路的方式,比如参数配置方式,组合逻辑产生,BCD码等,
其实还可以通过继承方式产生电路,因为chisel是依赖于scala平台的,当然具有继承功能。
1)一个抽象计数器Ticker
abastract class Ticker(n:Int) extends Module { //n值用来计数
        val io = IO(new Bundle {
                val tick = Output(Bool()) //计数器的输出信号
        }
}
2)向下计数器
import chisel3._
class DownTicker(n:Int) extends Ticker(n) {
  val N = (n-1).U
  val cntReg = RegInit(N) //复位之后初值为N
  cntReg := cntReg - 1.U  //每时钟周期上升沿减1
  when(cntReg === 0.U) {
    cntReg := N   //减到0值时再次置为初值
  }

  io.ticker := cntReg === 0.U  //减到0时输出高电平脉冲
}

回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-9-4 10:25:53 | 显示全部楼层
产生的verilog文件内容如下:
module DownTicker(
  input   clock,
  input   reset,
  output  io_ticker
);
  reg [1:0] cntReg; // @[DownTicker.scala 6:23]

  wire [1:0] _T_1 = cntReg - 2'h1; // @[DownTicker.scala 7:20]
  wire  _T_2 = cntReg == 2'h0; // @[DownTicker.scala 8:15]
  assign io_ticker = cntReg == 2'h0; // @[DownTicker.scala 12:13]

  always @(posedge clock) begin
    if (reset) begin
      cntReg <= 2'h2;
    end else if (_T_2) begin
      cntReg <= 2'h2;
    end else begin
      cntReg <= _T_1;
    end
  end
endmodule也就是说从复位开始算起(第1个),第3个时钟上升沿出现计数脉冲,第四个消失,第六个时钟上升沿又出现计数脉冲,第7个又消失。。。



回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-9-4 10:29:11 | 显示全部楼层
main中代码是:Driver.execute(Array("--target-dir","generated"),()=>new DownTicker(3))
回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-9-4 10:36:52 | 显示全部楼层
import chisel3._
class DownTicker(n:Int) extends Ticker(n) {
  val N = (n-1).U
  val cntReg = RegInit(N) //复位之后初值为N
  cntReg := cntReg - 1.U  //每时钟周期上升沿减1
  when(cntReg === 0.U) {
    cntReg := N   //减到0值时再次置为初值
  }

  io.ticker := cntReg === N //寄存器值为N时输出高电平脉冲
}
产生的verilog文件内容如下:
module DownTicker(
  input   clock,
  input   reset,
  output  io_ticker
);
  reg [1:0] cntReg; // @[DownTicker.scala 6:23]
  wire [1:0] _T_1 = cntReg - 2'h1; // @[DownTicker.scala 7:20]
  wire  _T_2 = cntReg == 2'h0; // @[DownTicker.scala 8:15]
  assign io_ticker = cntReg == 2'h2; // @[DownTicker.scala 12:13]   复位的同时或寄存器值减到0值同时就会输出计数器高电平脉冲
  always @(posedge clock) begin
    if (reset) begin
      cntReg <= 2'h2;
    end else if (_T_2) begin
      cntReg <= 2'h2;
    end else begin
      cntReg <= _T_1;
    end
  end
endmodule



回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-9-4 11:10:21 | 显示全部楼层
io.ticker := cntReg === N
这种向下计数器,也就是说从复位开始算起(第1个)出现计数脉冲,第2个时钟消失,第四个时钟出现计数脉冲,第五个又消失。。。
回复

使用道具 举报

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

本版积分规则



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

GMT+8, 2024-4-29 04:29 , Processed in 0.015036 second(s), 17 queries .

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

Copyright © 2018-2021, risc-v open source

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