joe 发表于 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时输出高电平脉冲
}

joe 发表于 2021-9-4 10:25:53

产生的verilog文件内容如下:
module DownTicker(
input   clock,
input   reset,
outputio_ticker
);
reg cntReg; // @

wire _T_1 = cntReg - 2'h1; // @
wire_T_2 = cntReg == 2'h0; // @
assign io_ticker = cntReg == 2'h0; // @

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个又消失。。。



joe 发表于 2021-9-4 10:29:11

main中代码是:Driver.execute(Array("--target-dir","generated"),()=>new DownTicker(3))

joe 发表于 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,
outputio_ticker
);
reg cntReg; // @
wire _T_1 = cntReg - 2'h1; // @
wire_T_2 = cntReg == 2'h0; // @
assign io_ticker = cntReg == 2'h2; // @   复位的同时或寄存器值减到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



joe 发表于 2021-9-4 11:10:21

io.ticker := cntReg === N
这种向下计数器,也就是说从复位开始算起(第1个)出现计数脉冲,第2个时钟消失,第四个时钟出现计数脉冲,第五个又消失。。。
页: [1]
查看完整版本: 使用继承方式产生硬件电路