risc-v中文社区

 找回密码
 立即注册
查看: 1179|回复: 2

[原创] chisel组合逻辑电路

  [复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-8-17 21:07:24 | 显示全部楼层 |阅读模式
组合逻辑,没有时钟的电路,最简单的是布尔算式:
val v = (a & b) | c
还可以:
val o = ~v
scala语法中,不能再val v =...,否则就会出现reassignment to val
异常,对v必须要用:=操作符进行连线处理。
Chisel 还支持描述带有条件更新的组合电路。这样的电路被称为 Wire。
然后使用条件运算(例如 when)来描述电路的逻辑。以下代码声明了一个
UInt 类型的 Wire w 并分配了默认值 0。 when 块采用 Chisel Bool 并在
cond 为 true 时将 3 重新分配给 w:
val w = Wire(UInt())
w:=0.U
when(cond){
  w:= 3.U
}
可以带有.otherwise:
val w = Wire(UInt())
when(cond){
  w:=1.U
  } .otherwhen(cond2){
  w:=2.U
} .elsewise {
  w:=3.U
}
关于when,otherwise,elsewise,还是在我们前帖ALU中做实验:
import chisel3._
class Alu extends Module {
  //必须要实现抽象成员io
  val io = IO(new Bundle { //匿名Bundle类
    val a = Input(UInt(32.W)) //输入a
  val b = Input(UInt(32.W)) //输入b
  val k = Input(UInt(2.W)) //控制K
  val f = Output(UInt(32.W)) //输出结果f
  })
  io.f := 0.U  //赋初值
  //如果换成when和.otherwise
  when(io.k === 0.U){
    io.f := io.a + io.b
  } .elsewhen(io.k === 1.U){  
    io.f := io.a - io.b
  } .elsewhen(io.k === 2.U) {
    io.f := io.a | io.b
  } otherwise {
    io.f := io.a & io.b
  }
}

回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-8-17 21:08:55 | 显示全部楼层
对应产生的verilog代码如下:
module Alu(
  input         clock,
  input         reset,
  input  [31:0] io_a,
  input  [31:0] io_b,
  input  [1:0]  io_k,
  output [31:0] io_f
);
  wire  _T = io_k == 2'h0; // @[Alu.scala 24:13]
  wire [31:0] _T_2 = io_a + io_b; // @[Alu.scala 25:18]
  wire  _T_3 = io_k == 2'h1; // @[Alu.scala 26:20]
  wire [31:0] _T_5 = io_a - io_b; // @[Alu.scala 27:18]
  wire  _T_6 = io_k == 2'h2; // @[Alu.scala 28:20]
  wire [31:0] _T_7 = io_a | io_b; // @[Alu.scala 29:18]
  wire [31:0] _T_8 = io_a & io_b; // @[Alu.scala 31:18]
  wire [31:0] _GEN_0 = _T_6 ? _T_7 : _T_8; // @[Alu.scala 28:29]
  wire [31:0] _GEN_1 = _T_3 ? _T_5 : _GEN_0; // @[Alu.scala 26:28]
  assign io_f = _T ? _T_2 : _GEN_1; // @[Alu.scala 14:8 Alu.scala 25:10 Alu.scala 27:10 Alu.scala 29:10 Alu.scala 31:10]
endmodule
回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-8-17 21:13:35 | 显示全部楼层
当然,从学习角度来说,本帖可以不用Module,用RawModule可能更好些,因为是组合逻辑,不需要clock和reset
回复

使用道具 举报

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

本版积分规则



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

GMT+8, 2024-4-27 15:18 , Processed in 0.024578 second(s), 17 queries .

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

Copyright © 2018-2021, risc-v open source

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