前言
本文转载自 :Verilog动态截取固定长度语法+:和-:
参考 : Verilog常用语法
1 拼接运算符
{信号1的某几位,信号2的某几位,...,...,信号n的某几位},中间用逗号隔开,最后用大括号括起来表示一个信号整体。
位拼接表达式中不允许出现没有指明位数的信号;
位拼接可以用重复法来简化表达式:{4{w}}等同于{w,w,w,w};
位拼接还可以用嵌套的方式来表达:{b,{3{a,b}}}等同于{b,a,b,a,b,a,b}。
2 case语法
reg [2:0] out ; // 变量类型定义为reg,实际综合出来不是触发器。
always @ (*) begin
case(sel)
2'b00 : out = 2'd1; // If sel=0, output is a
2'b01 : out = 2'd3; // If sel=1, output is b
2'b10 : out = 2'd2; // If sel=2, output is c
default : out = 2'd0; // If sel is anything else, out is always 0
endcase
end
2.1 信号定义
//端口信号定义方式一:
module fsm(
rxflr,
ssi_oe_n
);
// ------------------------------------------------------
// -- Port Declaration
// ------------------------------------------------------
input [`RX_ABW :0] rxflr ;//这种wire类型的端口,不需要再下面重复定义。
output ssi_oe_n ;//这种reg类型的端口,需要在下面定义。
// ----------------------------------------------------------
// -- local registers and wires
// ----------------------------------------------------------
reg ssi_oe_n;
endmodule
//端口信号定义方式二:这种方式是当前使用较多的方式
module fsm(
input wire [`RX_ABW :0] rxflr,//ASIC常用,定义wire和reg
output reg ssi_oe_n
);
endmodule
//端口信号定义方式三:
module fsm(
input [`RX_ABW :0] rxflr ,//FPGA中常用,wire不定义
output ssi_oe_n //该信号也是wire类型
);
reg r_single;
assign ssi_oe_n = r_single ;
endmodule
//模块端口parameter定义如下
module ram_1r1w
#(
parameter width=128,
parameter deepth=32
)(
input wclk,
input [width-1:0] wdin,
input rclk,
output [width-1:0] dout
);
endmodule
例化如下:
ram_1r1w #(
.width ( 128 ),//这个端口要是没有的话,就是默认值
.deepth ( 96 ) //这个端口要是没有的话,就是默认值
)u_ram_1r1w_96x128(
.wclk ( wclk ),
.wdin ( wdata ),
.rclk ( rclk ),
.dout ( rdata )
);
//也可以这样例化
ram_1r1w u_ram_1r1w_96x128(
.wclk ( wclk ),
.wdin ( wdata ),
.rclk ( rclk ),
.dout ( rdata )
);
3 动态截取固定长度数据
参考如下:
reg [9:0] data;
reg [2:0] get_dout;
get_dout = data[i+:3] //表示截取数据data的bit i开始、合计取3bit位宽的数据
//i可以是cnt(计数器产生的变量)或者固定值
详细介绍如下所示: