Verilog Language;Multiplexers
always 以及 case ,casez 用法在Procedures
三目运算符 用法在More Verilog Features
1. +:与 -:的基本语法:
[起始地址
+:位宽
] = [起始地址
+位宽
-1: 起始地址
] (起始地址加上规定位宽的整个片段)
[结束地址
-:位宽
] = [ 结束地址
:起始地址
-位宽
+1] (结束地址减去规定位宽的整个片段)
例:
in [7 +: 8] = in [14 : 7]//起始地址为7,位宽为8
in [7 -: 8] = in [0 : 7]//结束地址为7,位宽为8
1.2-to-1 multiplexer
例1:
解:
module top_module
(
input a, b, sel,
output out
);
always@(*)
begin
case(sel)
1'b0 : out = a;
1'b1 : out = b;
endcase
end
endmodule
使用三目运算符好像简单很多
module top_module
(
input a, b, sel,
output out
);
assign out = (sel) ? b : a;
endmodule
2.2-to-1 bus multiplexer
例1:
解:
除了位宽与上题完全相同
module top_module(
input [99:0] a, b,
input sel,
output [99:0] out );
assign out = (sel) ? b : a;
endmodule
3. 9-to-1 multiplexer
例1:
解:
按照题目来就行
module top_module(
input [15:0] a, b, c, d, e, f, g, h, i,
input [3:0] sel,
output [15:0] out );
always@(*)
begin
case(sel)
4'b0000 : out = a;
4'b0001 : out = b;
4'b0010 : out = c;
4'b0011 : out = d;
4'b0100 : out = e;
4'b0101 : out = f;
4'b0110 : out = g;
4'b0111 : out = h;
4'b1000 : out = i;
default : out = 16'b1111111111111111;
endcase
end
endmodule
4. 256-to-1 multiplexer
例1:
8位二进制选择256个数,简单思路还是选择case,但由于
2
8
=
256
2^8 = 256
28=256所以直接令两者相等,即使不等也可以同过移位拼接等方法找到联系
解:
module top_module(
input [255:0] in,
input [7:0] sel,
output out );
assign out = in[sel];
endmodule
5. 256-to-1 4-bit multiplexer
例1:
与上题大致相同但是被选择的位宽由一位变成了四位,sel = 0 , out = [3:0] ···
解:
sel | 0 | 1 | 2 | ··· | 253 | 254 | 255 |
---|---|---|---|---|---|---|---|
out | [3:0] | [7:4] | [11:8] | ··· | [1015:1012] | [1019:1016] | [1023:1020] |
module top_module(
input [1023:0] in,
input [7:0] sel,
output [3:0] out );
assign out = in[4 * sel + 3 -: 4 ];//assign out = in[4*sel +: 4] 两种分别对应从高位开始和从低位开始
endmodule