22424始—— Vivado与Verilog学习有记[更新ing]

22424始—— Vivado与Verilog学习有记[更新ing],第1张

😋界面说明


 

选项作用
Schematic将所写代码构成电路图展现出来。
IP Catalog文件中所带的库函数
RTL ANALYSIS得出RTL图
SYNTHESIS对代码进行综合
IMPLEMENTATION对代码进行综合实现电路图
😋Verilog 代码说明
  • 0:逻辑0—“假”
  • 1:逻辑1—“真”
  • x 或X: 未知
  • z或Z:高阻

说明:x意味着信号数值的不确定;z意味着信号处于高阻状态,常见于( input ,reg )没有驱动时的逻辑结果。

😶现阶段常用的数据类型

线网 wire 由其连接的器件输出连续驱动,如果没有驱动元件连接到wire型变量,缺省值一般为 “Z”

寄存器 reg 表示存储单元,保持原有值直到被改写。可在任意时刻通过赋值 *** 作进行改写。

向量 位宽大于1时,wire或reg可声明为向量的形式。有点像C语言中的字符数组(字符串)。

定义向量时在中括号中给出了位数,定义位数时先写MSB的序号再写LSB的序号。当用向量表示数字时,术语MSB和LSB的意义是很直观的,在其余情况中,位选信号只是用来区分向量中不同位的.

示例:

reg [3:0]      counter ;    //声明4bit位宽的寄存器counter
wire [32-1:0]  gpio_data;   //声明32bit位宽的线型变量gpio_data
wire [8:2]     addr ;       //声明7bit位宽的线型变量addr,位宽范围为8:2
reg [0:31]     data ;       //声明32bit位宽的寄存器变量data, 最高有效位为0

整数 integer
声明时不用指明位宽,位宽和编译器有关,一般为32bit。reg型变量为无符号数,而integer型变量为有符号数。

实数 real
可用十进制或科学计数法来表示。实数声明不能带有范围,默认值为0。

时间 time
对仿真时间进行保存,宽度一般为64 bit,通过调用系统函数$time获取当前仿真时间。

数组
Verilog中允许声明reg,wire,integer,time,real及其向量类型的数组。数组维度没有限制。线网数组也可以用于连接实例模块的端口。数组中的每个元素都可以作为一个标量或向量。对于多维数组来讲用户需要说明每一维的索引。
示例:

integer          flag [7:0] ; //8个整数组成的数组
reg  [3:0]       counter [3:0] ; //由4个4bit计数器组成的数组
wire [7:0]       addr_bus [3:0] ; //由4个8bit wire型变量组成的数组
wire             data_bit[7:0][5:0] ; //声明1bit wire型变量的二维数组
reg [31:0]       data_4d[11:0][3:0][3:0][255:0] ; //声明4维的32bit数据变量数组

对数组元素赋值 *** 作:

flag [1]   = 32'd0 ; //将flag数组中第二个元素赋值为32bit的0值
counter[3] = 4'hF ;  //将数组counter中第4个元素的值赋值为4bit 十六进制数F,等效于counter[3][3:0] = 4'hF,即可省略宽度;
assign addr_bus[0]        = 8'b0 ; //将数组addr_bus中第一个元素的值赋值为0
assign data_bit[0][1]     = 1'b1;  //将数组data_bit的第1行第2列的元素赋值为1,这里不能省略第二个访问标号,即 assign data_bit[0] = 1'b1; 是非法的。
data_4d[0][0][0][0][15:0] = 15'd3 ;  //将数组data_4d中标号为[0][0][0][0]的寄存器单元的15~0bit赋值为3

向量是一个单独的元件,位宽为n;数组由多个元件组成,其中每个元件的位宽为n或1.它们在结构的定义上就有所区别。

存储器
存储器变量就是一种寄存器数组,可以用来描述RAM或者ROM的行为。

参数 parameter
表示常量,只能赋值一次。但是,通过实例化的方式,可以更改参数在模块中的值。局部参数用__localparam__来声明,作用与用法和parameter相同,区别在于它的值不能被改变。所以当参数只在本模块中调用时,可用localparam来说明。

字符串
字符串保存在reg类型的变量中,每个字符占用一个字节(8bit)。因此寄存器变量的宽度应该足够大,保证不会溢出。
字符串不能多行书写,字符串中不能包含回车符。如果寄存器变量的宽度大于字符串的大小,用0填充左边的空余位;反之截断删除。
如同C语言中,特殊字符特殊表示法,如下:

转义字符显示字符
\n换行
\t制表符
%%%
||
""
\ooo1到3个八进制数字字符
😶关键词

assign 对输出信号进行连续赋值

采用连续赋值描述电路:


 

module example3(x1,x2,s,f);
	input x1,x2,s;
	output f;

	assign f=(~s&x1)|(s&x2);
endmodule

always@() 包含着过程语句

  • ‘@’ 后面括号中的内容称为敏感事件列表,当用Verilog进行电路综合时,敏感事件列表直观告诉Verilog编译器哪些信号会直接影响 always 块产生的输出(可以用 * 代替所有信号 )
  • 一个 always 块可以只包含一条语句,也可以包含多条语句。一个典型的Verilog模块中可以包含多个 always 块。

示例:

 

//Behavioral specification
module example(x1,x2,s,f);
	input x1,x2,s;
	output f;
	reg f;
	always @(x1 or x2 or s)
		if(s==0)
			f=x1;
		else
			f=x2;
endmodule

begin -and 相当于C语言里的大括号

😶Verilog 中的语句

其实 Verilog 中的大部分语句和C语言中的语法差不多,但其中有些细节不一样:

    if … else

示例:

module mux2to1(w0,w1,w2,S,f);//2悬疑
	input w0,w1,w2;
	input [1:0]S;
	output reg f;
	always @*
		if(S==0)
			f=w0;
		else
			f=w1;
endmodule

    case

将控制表达式的值和每个选择语句的值按位进行比较,当有一个或多个选择匹配时,只执行第一个匹配的语句。当指定的选择不能包含控制表达式的所有可能值时,就必须包含default语句,否则Verilog编译器会综合存储器单元以处理未定义情况。

  • casex:
    casex 语句将所有z和x值作为无关项。

  • casez:
    casez 语句将所有z作为无关项对待。

简单的示例:

module dec2to4(W,En,Y); //二进制2-4译码器
	input [1:0]W;
	input En;
	output reg [0:3]Y;
always @(W,En)
	case({En,W}) // { , } 拼接向量
		3'b100:Y=4'b1000;//四位二进制数字
		3'b101:Y=4'b0100;
		3'b110:Y=4'b0010;
		3'b111:Y=4'b0001;
		default:Y=4'b000;
	endcase
endmodule

    for
注意:写到条件的时候,不存在 ++ 运算符,只能写作x=x+1。

示例:

module priority(W,Y,z);
   input [3:0]W;
   output reg[1:0]Y;
   output reg z;
   integer k;//整数
   always@(W)
   begin
   	Y=2'bx;
   	z=0;
   	for(k=0;k<4;k=k+1)
   		if(W[k])
   		begin
   			Y=k;
   			z=1;
   		end
   	end
   endmodule

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/733421.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存