FPGA学习中的小知识2

来源:互联网 发布:气候变化 知乎 编辑:程序博客网 时间:2024/05/21 10:44

11、综合工具不支持的Verilog结构
initial语句
循环结构:repeat、forever、while、非结构化的for语句
数据类型:event、real、time
UDP(用户定义基本单元)
for……join块
wait语句
过程持续赋值:assign、deassign、force、release
操作符:===、!==
12、编写时序元件的Verilog代码时应该注意:避免不必要的latch(锁存器);触发器的初始赋值(reset/set)不应在initial描述块内定义,而应该在其功能描述中

加以定义;组合电路避免出现反馈回路。
13、要避免在综合的过程中产生不必要的latch,在组合逻辑描述中必须保证:
(1)所有的if……else及其嵌套结构、case、casex、casez结构是满的。
(2)变量、信号的赋值在每一个分支中都应有明确的指定。
(3)if……else及其嵌套结构本身是满的。
(4)case、casex、casez必须包含default分支。
14、一个模块的基本语法:
module module_name(port1,port2,……);
//Declaration
    input,output,inout,
    reg,wire,parameter,
    function,mask,……
//Statement   
    Initial statement
    Always statement
    Module instantiation
    Gate instantiation
    Continuous assignment
endmodule
15、设计模块时可尽量考虑使用参数化,提高设计的重用。
16、调用模块时,采用的端口映射有
(1)位置对应
(2)端口对应(名字关联)
如,调用全加器模块module full_adder(a,b,ci,s,co);
full_adder full1(.a(本模块要传递的a),.b(本模块要传递的b),.ci(本模块要传递的ci),.s(本模块要传递的s),.co(本模块要传递的co))
(3)允许出现不连接的端口
尽量在端口映射时使用名字关联
17、只有寄存器类型的信号才可以在always和initial语句中进行赋值。
18、always语句从0时刻开始执行。
19、全加器的三种描述方式:
(1)结构化描述方式:
module full_adder(a,b,ci,s,co);
    input a,b,ci;
    output s,co;
    wire s1,t1,t2,t3;
   
    xor x1(s1,a,b);
    xor x2(s,s1,ci);

    and a1(t3,a,b);
    and a1(t2,b,ci);
    and a1(t1,a,ci);

    or o1(co,t1,t2,t3);
endmodule
(2)数据流描述方式:
module full_adder(a,b,ci,s,co);
    input a,b,ci;
    output s,co;
    wire s1,t1,t2,t3;
   
    assign #2 s1=a^b;
    assign #2 s=s1^ci;
    assign #2 t3=a&b;
    assign #2 t2=a&ci;
    assign #2 t1=b&ci;
    assign #2 co=t1|t2|t3;
endmodule
(3)行为描述方式:
[1]module full_adder(a,b,ci,s,co);
    input a,b,ci;
    output s,co;
    reg s,co;
    reg t1,t2,t3;
   
    always @(a or b or ci)
    begin
        s=(a^b)^ci;
        t1=a&b;
        t1=a&ci;
        t1=b&ci;
        co=(t1|t2)|t3;
    end
endmodule
[2]module full_adder(a,b,ci,s,co);
    input a,b,ci;
    output s,co;
    reg s,co;
    reg t1,t2,t3;
   
    always @(a or b or ci)
    begin
        {co,s}=a+b+ci;
    end
endmodule
20、一般的,对顶层设计,采用结构描述方式,对底层模块,可采用数据流、行为级或两者的结合。
两位的全加器:
module adder2(at,bt,cit,st,cot);
    parameter SIZE=2;
    input[SIZE:1] at;
    input[SIZE:1] bt;
    input cit;
    output[SIZE:1] st;
    output cot;

    wire temp;
   
    full_adder full1
    (
        .a(at[1]),
        .b(bt[1]),
        .ci(cit),
        .s(st[1]),
        .co(temp)
    );
    full_adder full2
    (
        .a(at[2]),
        .b(bt[2]),
        .ci(temp),
        .s(st[2]),
        .co(cot)
    );
endmodule