从二选一多路选择器开始

verilog中,我们往往通过一个三目运算符或者一个if...else语句来实现二选一的电路,大家在写硬件的时候一定要摒弃软件的思考方式,我们要时刻清楚的认识到自己正在描述的是一个硬件的电路,当你对自己写的每一部分verilog代码都能很清晰的在脑中抽象为具体的电路硬件的时候,你的硬件水平肯定是更上一层楼的。当然这是一个长期的过程,非一日之功,贵在坚持。

下面我们用spinalHDL来描述下面的硬件电路。

gatemux

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package cpu 

import spinal.core._ //两句import导入spinalHDL的核心库
import spinal.lib._

class MUX21 extends Component{ //Component类比verilog中的module
val io = new Bundle{ //定义输入输出,可以看成是一个电路的输入输出接口
val in1 = in Bool() //定义两个输入,一个选择信号
val in2 = in Bool()
val sel = in Bool()
val res = out Bool()//定义输出
}

/**
此处不能使用if...else
官方定义的说明是在表示选择的时候,我们使用的是
when...otherwise的搭配
我前期用if...else试,结果生成的verilg代码并不是自己所想,然后去官方项目
提了个issue,结果作者回复说要用 when...otherwise的搭配,顺道提醒我官方文档
中有所说明,这就再次证明了读文档的重要性
*/
when(io.sel){
io.res := io.in1
}otherwise{
io.res := io.in2
}
}

object MUX {
def main(args:Array[String]){
SpinalVerilog(new MUX21)
}
}

此时我们的项目结构如下
在官方的项目结构下,我们首先建立一个cpu的文件夹,在下面建立一个mux21.scala的文件,之后我们的文件就都放在这里实现。

content.png

书写完成后,我们用在项目文件夹下打开terminal,输入下列命令将我们的代码转化为对应的verilog代码。结果如下图所示

cpumux.png

此时我们的工程文件下就会生成一个编译好的MUX21.v文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
module MUX21 (
input io_in1,
input io_in2,
input io_sel,
output reg io_res
);

always @(*) begin
if(io_sel) begin
io_res = io_in1;
end else begin
io_res = io_in2;
end
end

endmodule

注电路图绘制工具为logisim,安装方式也很简单,在terminal输入下列命令即可
sudo apt install logisim