FPGA基础代码复用
一、verilog中有关代码复用的语法
1、连接符“{}”
{4{1'b1}} 或者 {5'd6, 5'd8}
2、参数(Parameter)型常量定义
parameter 参数名=表达式; 或者 localparam 参数名=表达式;
parameter DATA_WIDTH = 20;
3、function函数定义
函数内部语句只能写组合逻辑。
function [7:0] adder;
input [6:0] a;
input [6:0] b;
beginadder = a + b;
end
endfunction
4、for语句
for(表达式1;表达式2;表达式3) 语句
genvar i;
for(i=0; i<10; i=i+1)
5、generate-for语句
(1) 必须使用genvar定义一个正整数变量;
(2) for里面的内嵌语句,必须写在begin_end里面;
(3) begin_end需要定义名字。
genvar i;generate for(i=0; i<10; i=i+1)begin语句;end
endgenerate
二、代码复用示例
1、使用函数定义
module test(input wire [6:0] a,input wire [6:0] b,input wire [6:0] c,input wire [6:0] d,output reg [7:0] ab,output reg [7:0] bc,output reg [7:0] cd;
);function [7:0] caler;
input [6:0] a;
input [6:0] b;
beginadder = {a, 1'b0} + b;
end
endfunction always(posedge clk) beginif(reset) begin{ab,bc,cd} <= 'b0;end else beginab <= caler(a,b);bc<= caler(b,c);cd <= caler(c,d);end
endendmodule
2、使用generate示例
(1)语句复用
parameter DATA_WIDTH = 7;reg [DATA_WIDTH*10-1:0] a;reg [DATA_WIDTH*10-1:0] b;reg [DATA_WIDTH*10-1:0] c;genvar i;generate for(i=0; i<10; i=i+1)beginalways(posedge clk) beginif(reset) beginc[(i+1)*DATA_WIDTH-1:i*DATA_WIDTH] <= 'b0;end else beginc[(i+1)*DATA_WIDTH-1:i*DATA_WIDTH] <= a[(i+1)*DATA_WIDTH-1:i*DATA_WIDTH] + b[(i+1)*DATA_WIDTH-1:i*DATA_WIDTH];endendend
endgenerate
(2)模块复用
parameter IN_WIDTH = 7;parameter OUT_WIDTH = 8;reg [IN_WIDTH*10-1:0] a;reg [IN_WIDTH*10-1:0] b;reg [IN_WIDTH*10-1:0] c;reg [IN_WIDTH*10-1:0] d;wire [OUT_WIDTH *10-1:0] ab;wire [OUT_WIDTH *10-1:0] bc;wire [OUT_WIDTH *10-1:0] cd;genvar i;generate for(i=0; i<10; i=i+1)begintest(.clk(clk),.reset(reset),.a(a[(i+1)*IN_WIDTH-1:i*IN_WIDTH]),.b(b[(i+1)*IN_WIDTH-1:i*IN_WIDTH]),.c(c[(i+1)*IN_WIDTH-1:i*IN_WIDTH]),.d(d[(i+1)*IN_WIDTH-1:i*IN_WIDTH]),.ab(ab[(i+1)*OUT_WIDTH-1:i*OUT_WIDTH]),.bc(bc[(i+1)*OUT_WIDTH-1:i*OUT_WIDTH]),.cd(cd[(i+1)*OUT_WIDTH-1:i*OUT_WIDTH]));end
endgenerate
总的来说,使用generate确实对代码的整体结构,以及调试提供了很大的方便,各位可以在编写代码的过程中多多使用。