CHISEL 点滴积累 之三

本文介绍了一个使用Chisel硬件描述语言实现的简单三八译码器设计。通过详细解析Chisel代码,展示了如何定义输入输出信号、使用条件语句以及实现二进制到八进制的转换。此外,还探讨了Wire和Reg类型的区别,以及它们在电路设计中的应用。
package simple1
import chisel3._
import chisel3.util._

class Alu extends Module {
val io = IO(new Bundle{
val a = Input (UInt(3.W))
val y = Output (UInt(8.W))
})

//io.y := ~(1 << io.a) ; 


var y   = Wire (UInt(8.W ))
 y:=255.U 
switch (io.a){
is(0.U) {y := 1.U  }
is(1.U) {y := 2.U  }
is(2.U) {y := 4.U  }
is(3.U) {y := 8.U  }
is(4.U) {y := 16.U  }
is(5.U) {y := 32.U  }
is(6.U) {y := 64.U  }
is(7.U) {y := 128.U  }
}
io.y := ~y;

}

object AluMain extends App{
println("Generating the ALU hardware ")
chisel3.Driver.execute(Array("--target-dir","generated"),()=>new Alu())
}
module Alu( // @[:@3.2]
  input        clock, // @[:@4.4]
  input        reset, // @[:@5.4]
  input  [2:0] io_a, // @[:@6.4]
  output [7:0] io_y // @[:@6.4]
);
  wire  _T_12; // @[Conditional.scala 37:30:@10.4]
  wire  _T_15; // @[Conditional.scala 37:30:@15.6]
  wire  _T_18; // @[Conditional.scala 37:30:@20.8]
  wire  _T_21; // @[Conditional.scala 37:30:@25.10]
  wire  _T_24; // @[Conditional.scala 37:30:@30.12]
  wire  _T_27; // @[Conditional.scala 37:30:@35.14]
  wire  _T_30; // @[Conditional.scala 37:30:@40.16]
  wire  _T_33; // @[Conditional.scala 37:30:@45.18]
  wire [7:0] _GEN_0; // @[Conditional.scala 39:67:@46.18]
  wire [7:0] _GEN_1; // @[Conditional.scala 39:67:@41.16]
  wire [7:0] _GEN_2; // @[Conditional.scala 39:67:@36.14]
  wire [7:0] _GEN_3; // @[Conditional.scala 39:67:@31.12]
  wire [7:0] _GEN_4; // @[Conditional.scala 39:67:@26.10]
  wire [7:0] _GEN_5; // @[Conditional.scala 39:67:@21.8]
  wire [7:0] _GEN_6; // @[Conditional.scala 39:67:@16.6]
  wire [7:0] y; // @[Conditional.scala 40:58:@11.4]
  assign _T_12 = 3'h0 == io_a; // @[Conditional.scala 37:30:@10.4]
  assign _T_15 = 3'h1 == io_a; // @[Conditional.scala 37:30:@15.6]
  assign _T_18 = 3'h2 == io_a; // @[Conditional.scala 37:30:@20.8]
  assign _T_21 = 3'h3 == io_a; // @[Conditional.scala 37:30:@25.10]
  assign _T_24 = 3'h4 == io_a; // @[Conditional.scala 37:30:@30.12]
  assign _T_27 = 3'h5 == io_a; // @[Conditional.scala 37:30:@35.14]
  assign _T_30 = 3'h6 == io_a; // @[Conditional.scala 37:30:@40.16]
  assign _T_33 = 3'h7 == io_a; // @[Conditional.scala 37:30:@45.18]
  assign _GEN_0 = _T_33 ? 8'h80 : 8'hff; // @[Conditional.scala 39:67:@46.18]
  assign _GEN_1 = _T_30 ? 8'h40 : _GEN_0; // @[Conditional.scala 39:67:@41.16]
  assign _GEN_2 = _T_27 ? 8'h20 : _GEN_1; // @[Conditional.scala 39:67:@36.14]
  assign _GEN_3 = _T_24 ? 8'h10 : _GEN_2; // @[Conditional.scala 39:67:@31.12]
  assign _GEN_4 = _T_21 ? 8'h8 : _GEN_3; // @[Conditional.scala 39:67:@26.10]
  assign _GEN_5 = _T_18 ? 8'h4 : _GEN_4; // @[Conditional.scala 39:67:@21.8]
  assign _GEN_6 = _T_15 ? 8'h2 : _GEN_5; // @[Conditional.scala 39:67:@16.6]
  assign y = _T_12 ? 8'h1 : _GEN_6; // @[Conditional.scala 40:58:@11.4]
  assign io_y = ~ y; // @[Alu.scala 26:6:@50.4]
endmodule

 

这里实践一个简单的三八译码器。

要定义val y必须要指定类型,如果直接用别的对象初始化,则就类型就是初始化类型传递过来的。

如果仅仅定义一个没有初始化(或者使用无类型的初始哈比如0.U),则需要定义其类型。

现在我接触的类型有Wire和Reg以及Reginit,后两者是寄存器类型,生成寄存器电路。而Wire也仅仅相当于中间临时连线。

 

TODO: 

1,在CHISEL中,常数的16进制表示法。

2,在CHISEL中,移位操作的云算符。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值