关于FPGA设计中的一些小tip(1)

记录FPGA学习过程中常用的一些知识!

一、综合和不可综合语句

1 可综合语句

input、output、parameter、reg、wire、always、assign、begin…end、case、posedge、negedge、or、and、default、if、function、generate、integer、`define,while、repeat 、for (while、repeat循环可综合时,要具有明确的循环表达式和循环条件,for可综合时也要有具体的循环范围)

2 不可综合语句

initial、fork… join、wait、time、real、display、forever

二、触发器和锁存器

在这里插入图片描述
锁存器引入的途径:

if 缺少 else ;case 缺少 default

三、Verilog小数表示(定点数)

mQn格式(m和n均为正整数且m>n)

  • mQn是一个有符号数,最高位为符号位
  • mQn数据的总位宽为m
  • mQn数据的小数位宽为n

一个位宽为m的无符号整数的数据范围为0 ~ 2^m-1
而一个位宽为m的有符号整数的数据范围为 − 2 m − 1   2 m − 1 − 1 -2^{m-1}~2^{m-1}-1 2m1 2m11


假设一个有符号小数为4’b1011,它的数据格式为4Q2,也就是说它的小数位为2位,其表示的十进制数为:

4 ’ b 10.11 = 1 × ( − 2 1 ) + 0 × 2 0 + 1 × 2 − 1 + 1 × 2 − 2 = − 2 + 0 + 0.5 + 0.25 = − 1.25 4’b10.11 = 1 \times(-2^1)+0 \times 2^0+1 \times 2^{-1}+1 \times 2^{-2} = -2 + 0 + 0.5 + 0.25 = -1.25 4’b10.11=1×(21)+0×20+1×21+1×22=2+0+0.5+0.25=1.25


两个有符号数的和
要把5Q2的数据5’b100.01和4Q3的数据4’b1.011相加:

  1. 由于5Q2的数据小数位只有2位,而4Q3的数据小数点有3位,所以先把5Q2的数据5’b100.01扩位为6Q3的数据6’b100.010,使它和4Q3数据的小数点对齐
  2. 小数点对齐以后,然后把4Q3的数据4’b1.011进行符号位扩展成6Q3的数据6’b111.011
  3. 两个6Q3的数据相加,为了保证和不溢出,和应该用7Q3的数据来存储。所以需要先把两个6Q3的数据进行符号位扩展成7Q3的数据,然后相加,这样才能保证计算结果是完全正确的。

两个有符号数的乘
两个有符号数相乘,为了保证积不溢出,积的总数据位宽为两个有符号数的总位宽之和,积的小数数据位宽为两个有符号数的小数位宽之和

mQn和aQb数据相乘,积应该用(m+a)Q(n+b)格式的数据进行存储

四、参数定义parameter

parameter 参数名=数据名;

定义:

module test (	input clk,
				input rst_n);

				parameter a= 1,
				parameter b= 2,
				parameter c= 3
endmodule

调用:

test #(
		.a(2),
		.b(3),
		.c(1))
	test1(	.clk(clk),
			.rst_n(rst_n));

defparam test1.a = 3

defparam可以直接在上层模块去直接修改下层模块的参数,从而实现参数化调用,但是参数需要使用绝对路径来指定

不要用defparam去修改在实体内声明的parameter,因为不可综合,用带参数值模块例化可以。


defineparamneter都可以用于完成文本替换的功能,但其存在本质上的不同,前者是编译之前就预处理,而后者是在正常编译过程中完成替换的。

此外,`define和parameter存在下列两点不同之处:

  1. parameter作用于声明的那个文件;`define从编译器读到这条指令开始到编译结束都有效,或者遇到undef命令使之失效,可以应用于整个工程。如果要让parameter作用于整个项目,可以将如下声明写于单独文件,并用include让每个文件都包含声明文件。
  2. parameter可以用作模块例化时的参数传递,实现参数化调用;define语句则没有此作用。`define语句可以定义表达式,而parameter只能用于定义变量

localparam其作用域仅可以用作所定义的module内使用,不可以用作参数传递使用

五、`include语句

使用 include语句进行文件包含,一般在被包含的文件里定义一些常用的task和`define方便后续的使用

`include "file1.v"

(不需要;)

`include “绝对路径”/ include “相对路径”

六、$readmemx

r e a d m e m b 、 readmemb、 readmembreadmemh(只能读取二进制、十六进制的数)
从文件中读取数据到存储器中。可以在仿真的任何时刻被执行使用,使用格式共六种:

$readmemb(“<数据文件名>”,<存贮器名>)
$readmemb (“<数据文件名>”,<存贮器名>,<起始地址>)
$readmemb (“<数据文件名>”,<存贮器名>,<起始地址>,<结束地址>)
$readmemh(“<数据文件名>”,<存贮器名>)
$readmemh (“<数据文件名>”,<存贮器名>,<起始地址>)
$readmemh (“<数据文件名>”,<存贮器名>,<起始地址>,<结束地址>)

被读取的数据文件的内容只能包含:空白位置(空格、换行、制表格、注释行、二进制或十六进制的数字。数字中不能包含位宽说明和格式说明,对于 r e a d m e m b 和 readmemb和 readmembreadmemh系统任务,每个数字可以是二进制和十六进制数字。另外,数字必须用空白位置或注释行来分隔开。

七、signal tap II逻辑分析仪的使用

signal tap logic analyzer 采集并显示FPGA设计中的实时信号行为,从而无需额外的I/O管脚或者外部实验室设备即可检查正常器件操作期间内部信号的行为。

在数据获取期间,器件中的存储器模块存储采集的数据,然后通过JTAG通信电缆将数据传输到逻辑分析仪。

逻辑分析仪在采样时钟的每个上升沿进行数据采样。逻辑分析仪不支持在采样时钟的下降沿进行数据采样。设计中的任何信号都可以用作采样时钟。但是,为了获得最佳的数据采样结果,请使用与被测信号同步的全局时钟。

针对被采样的数据中的每个信号,采样深度指定了采样和存储的样本的数量。在器件存储器资源有限的情况下,由于所选的深度太大,设计可能无法编译。此时需要降低采样深度以减少资源使用。

利用逻辑分析仪可以直接查看到开发板内部运行的波形。所以在很多时候,都是利用逻辑分析仪进行板级测试作为最终结果。

如果不需要工程中的逻辑分析仪,可以打开assignments -> settings –> signal tap logic analyzer,将使能的对勾去掉,然后重新编译就可以了。

SignalTap 与外部逻辑分析仪功能类似,主要用来分析数据的变化。但 SignalTap II 是利用 FPGA 内部的逻辑单元以及 RAM 资源实时地捕捉和显示实时信号,所以需要消耗一定的 FPGA 内部资源。与 Modelsim 仿真不同之处在于,SignalTap II 要与硬件结合,程序在 FPGA 中运行,实时显示真实的数据。可以选择要捕捉的内部信号 ,触发条件,捕捉的时间,捕捉多少数据样本等,帮助工程师查看实时数据进行 debug。

SignalTap II 利用 RAM 和逻辑单元与内部的信号连接 ,并通过 JTAG 接口连接 FPGA 与 Quartus II 软件,可以在 SignalTap II 里观察分析数据。

在这里插入图片描述
在这里插入图片描述
如果不满足触发条件,Signaltap就一直显示Waiting for trigger。

八、generate for

generate-for只针对于module、reg、net、assign、always、parameter、function、initial、task等语句或者模块,而for只针对于非例化的循环

1、generate-for语句必须用genvar关键字定义for的索引变量;
2、for的内容必须用begin end块包起来,哪怕只有一句;
3、begin end块必须起个名字

eg: 将输出与输入换位输出

module top_module( 
    input [7:0] in,
    output [7:0] out
);

    genvar i;
    generate
        for(i = 0; i < 8; i = i + 1) begin : bit_reverse
            assign out[i] = in[7 - i];
        end
    endgenerate
endmodule

用for循环实现:

module top_module( 
    input [7:0] in,
    output [7:0] out
);
    reg [7:0] out;
    always@(*) begin: bit_reverse
        integer i;
        for(i = 0;i <8; i = i + 1) begin
            out[i] = in[7-i];
        end
    end
 
endmodule

九、Verilog运算符优先级

在这里插入图片描述

十、任务(task) 和函数 (function)

任务(task)定义格式如下:

   task <任务名>;                     //注意无端口列表

           端口及数据类型声明;

           其他语句;

    endtask

函数(function)定义格式如下:

   function <返回值位宽或类型说明> 函数名;

         端口及数据类型声明;

         其他语句;

   endfunction

任务与函数的区别:
在这里插入图片描述

//任务
task add1;										//注意无端口列表
    input [7:0] a,b;							//输入端口和数据类型声明
    output reg [8:0] out1;					//输出端口和数据类型声明
    out1 = a + b;								//a,b,out1名称的作用范围仅为task任务内部
endtask


//调用任务
always@(in1 or in2) begin
    add1(in1,in2,out1);						//调用任务,注意端口列表的顺序要和任务中定义的一致
end

//函数
function [8:0] add2;							//函数定义  函数会自动生成一个和函数名同名的内部变量,作为函数返回值所用的寄存器。
    input [7:0] c,d;							//输入端口声明  函数只有输入端口,输出端口为函数名本身。
    add2 = c + d;								//返回输出值  输出寄存器为和函数同名的内部寄存器
endfunction
//调用函数
always @(in3 or in4) begin
    out2 = add2(in3,in4);					//调用函数,注意端口列表的顺序要和函数中定义的一致
end

调用任务时,需要向任务中传递输入输出端口

在调用函数的时候,只需要传递输入信号,函数的返回值作为输出信号。

十一、timescale

timescale包含时间单位时间精度两部分

设定格式为 timescale timeunit / timeprecision

如果设定`timescale 1ns/1ps,#100是相对时间,等价于#100ns,而#100.1111会被认为是#100.111ns,因为它的精度高于timescaled的时间精度,而被四舍五入。

十二、case

case

case(控制表达式/值)

分支表达式:执行语句

default:执行语句

endcase

自上而下,按照顺序逐个对分支表达式进行判断

注意:

  • 分支表达式不能重复,否则会出现冲突;
  • 执行完某一操作后,跳出case语句;
  • 控制表达式与多个分支表达式匹配,只执行从上至下首个匹配项(判断顺序进行,执行一次后就跳出case语句了);

casez

casez进行控制表达式与分支表达式的比较时,不关注高阻态位(不管是控制表达式还是条件表达式,这些位均默认为匹配);

casez允许“z”和"?“值在比较时被当做不关心的值,如果“z”和”?“值出现在case expression中或case item中时,那么就不关心对应的位,即不匹配对应的位。“z”和“?”是等价的,只不过用“?”更加清晰一点。注意,在编写可综合的代码时,要小心使用casez,使用casez时最好使用“?”而不是"z”。

casex

casex进行控制表达式与分支表达式的比较时,不关注高阻态,以及不定位(不管是控制表达式还是条件表达式,这些位均默认为匹配);

casex允许“x”、“z”和“?”值在比较时被当做不关心的值,如果“x”、“z”和"?"值出现在case expression中或case item中时,那么就不关心对应的位,即不匹配对应的位。注意,在编写可综合的代码时,不要使用casex。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值