FPGA笔记记录

软核:综合前的RTL模型
固核:带有平面规划信息的网表、FPGA实现的
硬核:经过信息验证的设计版图、专用集成电路实现的
vivado使用流程:选芯片、setting选IP核
always @(sl or a or b )//表示只要sl、a、b有一个变化就执行下面的语句
#1、#2//表示门输入到输出延迟1个或者2个单元
synthesis(综合),表示将逻辑表达式转化为与或非等门
‘bz表示高阻态
基于时序逻辑用reg,always中只能用reg,组合逻辑一般用wire
always #50 clock=~clock //产生一个不断重复的周期为100的时钟信号
always @(posedge clock)//上升沿到来时执行上述代码,下降沿用negedge
{KaTeX parse error: Expected 'EOF', got '}' at position 7: random}̲是系统函数,会产生一个随机数 …random}%2 //表示延迟一个时间单位后产生随机信号比特流
muxtwo m(.out(),.a(),.b(),.sl());

功能定义的三种情况(以下三种情况是同时执行的,也就是并发的),
① assign a=b&c;
//连续赋值语句,不能再always里面使用assign,assign是一种线的赋值语句,不可以给reg赋值
用法:(1)作为信号量输出,通过寄存器连续赋值
output [3:0] o_led;
reg [3:0] sr_led;
assign o_led[3:0]=sr_led[3:0];
(2)作为信号量输出,通过寄存器拼接数据位实现
output [15:0] OSI_Data;
reg [3:0] s_Hex;
reg [7:0] s_SEGBINARY;
reg [3:0] s_seg_sel;
assign OSI_Data={s_Hex,s_SEGBINARY,s_sef_sel};
(3)作为信号量输出,通过判断条件,赋值给信号
output[ 1: 0] oSEG_STATE;
output oCP_PLUSE;
wire s_CNTEQCYCLE;

parameter PARAM_7SEG_CYCLE = 32’d2500000;

reg [ 1: 0] sr_SEG_STATE;
reg [31: 0] sr_cnt;
reg sr_cp_pluse;
assign oSEG_STATE = sr_SEG_STATE;
assign oCP_PLUSE = sr_cp_pluse;

assign s_CNTEQCYCLE = ( sr_cnt == PARAM_7SEG_CYCLE ) ? 1 : 0;
(4)作为输出信号量,通过输入信号量赋值给输出,同样可以输入信号量和寄存器组合逻辑,赋值给输出信号量。
input iCLK50M;
input iCP_PULSE;
input[15:0] iSI_DATA;
output oSI;
output oCP;
reg [ 3: 0] sr_cnt;
reg [15: 0] sr_si_data;
reg sr_cp;
reg sr_en;
assign oSI = sr_si_data[15];
assign oCP = sr_en & iCLK50M;
② and #2 u1(q,a,b);
//采用实例,名字唯一,输出延迟两个单位q=a&b;
③ always @(posedge clk or posedge clr);
//always块内的语句是顺序执行的,always块也被称为过程块
begin
if(clr) q<=0;
else if(en) q<=d;
end
注意:①在verilog内的所有过程块(如initial块、always块)、连续赋值语句、实例引用都是并行的。②他们表示的是一种通过变量名相互连接的关系。③同一模块中,三者没有先后顺序。④只有连续赋值语句和实例引用语句可以独立于过程快而存在于模块的功能定义部分。

数据类型
reg型、wire型、integer型、parameter型
large型、medium型、scalared型、time型、small型、tri型、trio型、tril型、triand型、trior型、vectored型、wand型、wor型
常量
数字:二进制(b、B)、十进制(d、D)、十六进制(h、H)、八进制(o、O)
数字表达方式:<位宽><进制><数字>、<进制><数字>(默认位宽,由机器决定,至少32位)、<数字>(默认十进制),位宽的大小是由二进制来计算的
x表示不定值,z表示高阻抗
4‘b10x0 //位宽为4的二进制数从低到高第2位是不定值
4‘b101z //同理,第一位是高阻态值
12‘dz、12‘d? //位宽是12的十进制数,其值是高阻值
16‘b1010_1011_1111_1010 //合法,8b’_0011_1010//非法,下划线提高可读性
字母用8位ASCII值表示
parameter表示常量,用法是 parameter 参数名1=表达式1,参数名2=表达式2;
…常量一般是定义延迟时间和宽度…
可以通过#(4,0)给函数内的常量传参
多层次的模块可以通过defparam定义参数
module Annotate
defparam
Test.T.B1.P=2;
Test.T.B2.P=3;
endmodule
…变量…
1.网络数据类型wire、tri型,表示实体之间的物理连接,不能储存数据,收到驱动器(门或连续复制语句assign)的驱动,如果没有连结,就是高阻抗。wire表示单个门驱动或者连续赋值语句驱动,tri表示多个门驱动
wire a; //定义了一个1位的wire型数据
wire [7:0] b,c; //定义了两个8位的wire型数据
wire [4:1] d; //定义了一个4位的wire型数据
wire类型和assign连用,wire [n-1:0] 数据名1,数据名2…数据名i//表示有i条总线,每条总线内部有n条线路。或者wire [n:1] 数据名1…。[]表示位宽,即数据有几位
2.reg型,数据储存单元的抽象,通过赋值语句可以改变其储存的值。默认值是不定值x。定义数据同wire。
3.memory型,用于定义数组。
reg [7:0] mema[255:0]; //表示一个名为mema的储存器,该储存器有256个8位储存器,该储存器的地址是从0到255。

模运算符的结果和第一个操作数符号相同,若是第一个操作数有不定值x,则结果也有不定值x
-11%3=-2
11%-3=2
按位异或,~按位同或
0&x=0,1&x=x,x&x=x
0|x=x,1|x=1,x|x=x
x^all=x,异或相同取0,不同取1
x^~all=x,同或相同取1,不同取0
不同长度操作,右端对齐,左端补0
&&、||的优先级低于关系运算符(<、>、<=、>=),!的优先级高于算数运算符(&&、||),算术运算符的优先级高于关系运算符
,!=,=,!==的含义:==只判断0、1,若是出现x、z则返回x。===判断0、1、x、z,一模一样才返回1
<<左移位运算符,>>右移位运算符,用0填补空位
initial语句块表示从仿真的0时刻执行下面,用begin end划分,一个模块中有多个initial块,他们都是从0时刻并发执行。
$finish是结束仿真, $stop是暂停仿真
拼接运算符{}
{4{w}} //表示{w,w,w,w}
{b,{3{a,b}}} //表示{b,a,b,a,b,a,b},重复的表达式必须是常量
{a,b[3:0],w,3’b101} //表示{a,b[3],b[2],b[1],b[0],w,1’b1,1’b0,1’b1}
缩减运算符,单目运算符,第一位与第二位操作,结果与第三位操作,递推至最后一位。
C=&B; //等价于C=(((B[0]&B[1])&B[2])&B[3]);或、非相同
优先级别:(!、)->(*、/、%)->(+、-)->(<<、>>)->(<=、>=、>、<)->(==、!=、===、!==)->(^、^)->(|)->(&&)->(||)->(?:)
在这里插入图片描述

关键字
在这里插入图片描述

赋值语句
1.非阻塞赋值b<=a;
特点:①在语句块中,不能立即为下面的语句所用;②快结束后才能完成这次操作,而所赋的变量值是上一次赋值得到的;③在编写可综合的时序逻辑模块时,这是常用的方法。
2.阻塞赋值b=a;
特点:赋值语句执行完后,块才结束;②b的值在赋值语句执行后立刻发生改变;③在时序逻辑中使用,会有意想不到的结果。

块语句
1.begin_end顺序块
特点:①顺序执行;②每条语句的延迟时间是相对于前一条语句的仿真时间而言的;③直到最后一条语句执行完,程序流程控制才跳出该语句块。
begin end、begin:块名 end
2.fork_join
特点:①块内语句同时执行;②块内每条语句的延迟时间是相对于程序流程控制进入块内的仿真时间的;③延迟时间是用来给赋值语句提供执行时序的;④当按时间时序排序在最后一个语句执行完,或执行一个disable语句,程序流程控制跳出该程序块。
fork join、fork:块名 join

块名的作用:①定义局部变量;②允许被其他语句调用,如disable语句

#d ->end_wave
->表示触发事件end_wave使其翻转

……………………………………………………………………………………………………………………………………………………
if的使用
if else条件语句必须在过程块中使用,即在initial块或者always块,并写上begin end,在模块其他地方不能使用
if注意点:①逻辑表达式0、x、z为假,1为真;②分号;③语句可以用begin end括起来,相当于C语言中的{};④可以简写,如if(expression)等价于if(expression==1);⑤可以内嵌if,注意使用begin end;⑥
……………………………………………………………………………………………………………………………………………………
case的使用
使用形式:
(1)case(表达式) <case分支项> endcase
(2)casez(表达式) <case分支项> endcase
(3)casex(表达式) <case分支项> endcase
注意:①case括弧内的表达式称为控制表达式,case分支项的表达式被称为分支表达式。一般控制表达式表示信号的某些位,分支表达式是具体的状态。②分支表达式与控制表达式相同时,就执行分支表达式中的值,如果没有相等的,就执行default中的表达式。③default可有可无,一个case里面智能有一个default选项。④分支的值互不相同。⑤执行case选项后,跳出case语句结构,终止case语句的执行。⑥对应为能具体比较时,比较才能成功。⑦case语句的所有位宽都要相同,这样才能比较。
case的比较必须完全一样比较成功;casez除了一模一样外,跟z比较都正确;casex除了一模一样外,跟x、z比较都正确。其作用是casez不用管z,casex不用管x、z,因为都返回1.
例子:
reg[15:0] rega;
case(rega)
16‘d0:result=10’b0111111;
16’d1:result=10’b1011111;
…………………………………………
default:result=10’bx;
endcase

8’b01??? //表示后6位是高阻态
……………………………………………………………………………………………………………………………………………………
循环语句:forever、repeat、while、for
1.forever语句,用在initial块中,不能单独使用,常用语产生周期波形
forever 语句
forever begin 多条语句end
2.repeat语句,执行语句n,表达式一般是次数
repeat(表达式) begin end
3.while语句同C语言
4.for语句同C语言
……………………………………………………………………………………………………………………………………………………
顺序块
initial
begin
end
并行快
initial
fork
join
……………………………………………………………………………………………………………………………………………………
命名块的特点:声明的局部变量、可以通过层次名进行引用、可以被禁用(比如停止运行)
disable:终止命名块执行、退出循环、处理错误条件、根据控制信号来控制某些代码是否被执行,相当于break。break只能退出当前的循环、disable可以禁用设计中任意一个命名块。使用方法:disable block1:
……………………………………………………………………………………………………………………………………………………
生成块,动态生成verilog代码,generate-endgenerate指定范围。
可以是以下一种或多种类型:模块、用户定义原语、门级原语、连续赋值语句、initial和always块。
在生成范围内可以声明以下类型:net、reg;integer、real、time、realtime(实时时间类型);event。生成的数据类型有唯一的标识符,可以被层次引用。
不允许出现的模块项包括:参数、局部参数;输入、输出和输入/输出声明;指定块。
创建生成语句的方法:循环生成、条件生成、case生成。
1.循环生成语句
循环生成语句允许使用者对下面的模块或模块项进行多次实例引用:变量声明、模块、用户定义原语、门级原语、连续赋值语句、initial和always块
要定义生成变量genvar j;

2.条件生成语句
可以调用模块、用户定义原语、门级原语、连续赋值语句、initial和always块
3.case生成语句
可以调用模块、用户定义原语、门级原语、连续赋值语句、initial和always块
生成快的作用:提高简洁性和可读性
……………………………………………………………………………………………………………………………………………………

系统命令
{$random}产生一个随机数
$finish是结束仿真, $stop是暂停仿真
¥display(“i=%d”,i)
……………………………………………………………………………………………………………………………………………………
结构声明语句:initial说明语句、always说明语句、task说明语句、function说明语句
initial只执行一次。always满足条件就执行一次,直到仿真结束。用begin end分隔。
task任务和function函数的区别:①函数只能和主模块共用一个仿真时间单位,任务可以单独定义;②函数不能启动任务,任务可以启动其他任务和函数;③函数至少有一个输入变量,任务可以没有或者多个输入变量;④函数有返回值,任务没有返回值。
task任务没有返回值,如switch_bytes(old_word,new_word);
function函数有返回值,如new_word=switch_bytes(old_word);

task <任务名>;
语句
endtask
启动任务是<任务名>(端口1,端口2,…,端口n),端口对应着声明的顺序
repeat(count)
@(posedge clock);//等待count个时钟的上升沿

function <返回值的类型或范围> (函数名);
<端口说明语句>
<变量类型说明语句>
begin
<语句>

<函数名>=result_expression;
end
endfunction
函数也可以使用C风格的定义:<函数名>(input [31:0] addr)
函数的限制:①不能包含时间控制语句,如#,&,wait等;②函数不能启动任务;③函数至少要有一个输入变量;④必须要有<函数名>=result_expression;这一条语句。
递归函数的定义,前面加上automatic
带符号函数类型:function signed[31:0] <函数名>(input [31:0] vector);
……………………………………………………………………………………………………………………………………………………
常用的系统任务
$display(p1,p2,…,pn);//后有换行
$write(p1,p2,…,pn);//后没有换行
参数p1是格式控制,p2-pn是输出列表
在这里插入图片描述
在这里插入图片描述

%0h表示用最小的位数,%d对于十进制,前面的0用空格表示;对于其他进制,前面的0还是以0的形式显示。
在输出的的十进制中含有不确定或者高阻值,若是全部为不确定或者高阻值,那么输出小写的x或z;如果有部分为不确定或者高阻值,那么输出大写的X或Z。
……………………………………………………………………………………………………………………………………………………
1.打开文件 f o p e n 用 法 : < 文 件 句 柄 > = fopen 用法:<文件句柄>= fopen<>=fopen(“<文件名>”);
返回一个多通道描述符的32位值,多通道描述符中只有一位被设置为1。标准输出有一个多通道描述符,其最低位被设置为1,标准输出也被称为通道0,标准输出stdout一直是开放的。通道号与多通道描述符中被设置为1的位相对应。
2.写文件 f d i s p l a y 、 fdisplay、 fdisplayfmonitor、 f w r i t e 、 fwrite、 fwritefstrobe
用法: f d i s p l a y ( < 文 件 描 述 符 > , p 1 , p 2 , … , p n ) 、 fdisplay(<文件描述符>,p1,p2,…,pn)、 fdisplay(<>,p1,p2,,pn)fmonitor(<文件描述符>,p1,p2,…,pn)
文件描述符是一个多通道描述符,可以是文件句柄或者多个文件句柄按位组合。p1,p2,…,pn可以使变量、信号或者带引号的字符串。verilog可以把输出写到与文件描述符中值位1的位相关联的所有文件中。
3.关闭文件 f c l o s e 用 法 : fclose 用法: fclosefclose(<文件描述符>);
……………………………………………………………………………………………………………………………………………………
选通显示$strobe
%display和其他语句一起执行,发生的时间顺序就是不确定的。
$strobe总是在同时刻其他赋值语句执行完之后才执行,因此就提供了一种同步机制,他可以确保在同一时钟沿赋值的其他语句在执行完毕之后才显示数据。
……………………………………………………………………………………………………………………………………………………
VCD文件
initial
$dumpfile(‘myfile.dmp’);
initial
$dumpvars;
initial
$dumpvars(1,top);//转储模块实例top中的信号,数1表示层次的等级,只转储top下第一层的信号,即转存top模块中的变量,而不转储在top中调用模块的变量
initial
$dumpvars(2,top.m1);//转储top.m1模块下两层的信号
initial
$dumpvars(0,top.m1);//数0表示转储top.m1模块下面各个层的所有信号
//启动和停止转储过程
initial
begin
$dumpon;//启动转储过程
#1000000 $dumpoff;//过了100 000个仿真单位后,停止转储过程
end

//生成一个检查点,转储所有VCD变量的现行值
initial
$dumpall;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值