用Verilog的case语法做multiplexer出的问题
时间:10-02
整理:3721RD
点击:
用case语法,想做一个选择器, 16选1
wire [15:0]match;
wire [11:0]a;
wire [11:0]b[15:0];
always @(match)
case(match)
16'h0001:a=b[0];
16'h0002:a=b[1];
16'h0004:a=b[2];
16'h0008:a=b[3];
16'h0010:a=b[4];
16'h0020:a=b[5];
16'h0040:a=b[6];
16'h0080:a=b[7];
16'h0100:a=b[8];
16'h0200:a=b[9];
16'h0400:a=b[10];
16'h0800:a=b[11];
16'h1000:a=b[12];
16'h2000:a=b[13];
16'h4000:a=b[14];
16'h8000:a=b[15];
default:a=12'hxxx;
endcase
simulator或者合成,都报错,但是不显示是什么错误!
是因为b被设置为数组的原因,不能用一个变量来做索引吗?
求助
你的always的敏感电平列表有问题
always @(match)有问题,应该改成 always @(position)否则无法触发always工作
哎呀,不好意思, 笔误,笔误, 应该是match,不是position, 已经修改了, 仍然有问题呢
a要定义为reg,b也 要定义为reg,不能是wire类型
为什么b也要定义为reg型,不是只对赋值左边有要求吗?
三个问题:
1)敏感列表应该是always @(match or b)
2)a必须是reg型
3)b的定义方法需要verilog2005的支持,请检查工具是否支持。
为什么a必须是reg型呢?
1.a 必须是reg;b可以是wire 2. always@(match or b)
Enjoy.
这是最基本的语法啊。
wire只能连线或者assign,不能放了always里赋值。
- module multiplex(match);
- input [15:0]match;
- wire [11:0]b[15:0];
- reg [11:0]a;
-
- always @(match)
- case (match)
- 16'h0001: a = b[0];
- 16'h0002: a = b[1];
- 16'h0004: a = b[2];
- 16'h0008: a = b[3];
-
- 16'h0010: a = b[4];
- 16'h0020: a = b[5];
- 16'h0040: a = b[6];
- 16'h0080: a = b[7];
-
- 16'h0100: a = b[8];
- 16'h0200: a = b[9];
- 16'h0400: a = b[10];
- 16'h0800: a = b[11];
- 16'h1000: a = b[12];
- 16'h2000: a = b[13];
- 16'h4000: a = b[14];
- 16'h8000: a = b[15];
-
- default: a = 12'hxxx;
- endcase
- endmodule
我这个是可以综合通过的 仅供参考。
太二了, 写的时候弄错了,谢谢!
