8位寄存器verilog代码_【ZYNQ Ultrascale+ MPSOC FPGA教程】第三章 Verilog基础模块介绍...

本文是关于Verilog基础知识的教程,重点介绍8位寄存器的verilog代码实现。内容包括数据类型、运算符、组合逻辑和时序逻辑,适合初学者学习FPGA设计。通过实例讲解了wire、reg类型,以及各种运算符的使用,还涵盖了D触发器、移位寄存器和有限状态机的设计。
摘要由CSDN通过智能技术生成

原创声明:

本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处。

适用于板卡型号:

AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG

简介

本文主要介绍verilog基础模块,夯实基础,对深入学习FPGA会有很大帮助。

数据类型

常量

整数:整数可以用二进制b或B,八进制o或O,十进制d或D,十六进制h或H表示,例如, 8’b00001111表示8位位宽的二进制整数,4’ha表示4位位宽的十六进制整数。

X和Z:X代表不定值,z代表高阻值,例如,5’b00x11,第三位不定值,3’b00z表示最低位为高阻值。

下划线:在位数过长时可以用来分割位数,提高程序可读性,如8’b0000_1111

参数parameter: parameter可以用标识符定义常量,运用时只使用标识符即可,提高可读性及维护性,如定义parameter width = 8 ; 定义寄存器reg [width-1:0] a; 即定义了8位宽度的寄存器。

参数的传递:在一个模块中如果有定义参数,在其他模块调用此模块时可以传递参数,并可以修改参数,如下所示,在module后用#()表示。

例如定义模块如下调用模块

module rom 
#(
parameter depth =15,
parameter width =8
)
(
input[depth-1:0] addr ,
input[width-1:0] data ,
output result 
);
endmodule

module top();
wire[31:0] addr ;
wire[15:0] data ;
wire result ;
rom 
#(
.depth(32),
.width(16)
)
r1  
(
.addr(addr),
.data(data),
.result(result)
);
endmodule

Parameter可以用于模块间的参数传递,而localparam仅用于本模块内使用,不能用于参数传递。Localparam多用于状态机状态的定义。

变量

变量是指程序运行时可以改变其值的量,下面主要介绍几个常用了变量类型

1.Wire 型

Wire 类型变量,也叫网络类型变量,用于结构实体之间的物理连接,如门与门之间,不能储存值,用连续赋值语句assign赋值,定义为wire [n-1:0] a ; 其中n代表位宽,如定义wire a ; assign a = b ; 是将b的结点连接到连线a上。如下图所示,两个实体之间的连线即是wire类型变量。

44d5ee117cc3a187ef687b6ff3501a7d.png

2.Reg 型

Reg 类型变量,也称为寄存器变量,可用来储存值,必须在always语句里使用。其定义为

reg [n-1:0] a ; 表示n位位宽的寄存器,如reg [7:0] a; 表示定义8位位宽的寄存器a。如下所示定义了寄存器q,生成的电路为时序逻辑,右图为其结构,为D触发器。

module top(d, clk, q);
input  d  ;
input clk ;
outputreg q ;

always@(posedge clk)
begin
  q <= d ;
end
endmodule

0f6d6578e1d80555a68383ae1ea0c00b.png

也可以生成组合逻辑,如数据选择器,敏感信号没有时钟,定义了reg Mux,最终生成电路为组合逻辑。

module top(a, b, c, d, sel, Mux);
input   a ;
input   b ;
input   c ;
input   d ;
input[1:0] sel ;
outputreg Mux ;

always@(sel or a or b or c or d)
begin
case(sel)
2'b00: Mux = a ;
2'b01: Mux = b ;
2'b10: Mux = c ;
2'b11: Mux = d ;
endcase
end

endmodule

77bd950246d841b23f462b8641480251.png

3.Memory型

可以用memory类型来定义RAM,ROM等存储器,其结构为reg [n-1:0] 存储器名[m-1:0],意义为m个n位宽度的寄存器。例如,reg [7:0] ram [255:0]表示定义了256个8位寄存器,256也即是存储器的深度,8为数据宽度。

运算符

运算符可分为以下几类:

  1. 算术运算符(+,-,*,/,%)
  2. 赋值运算符(=,<=)
  3. 关系运算符(>,<,>=,<=,==,!=)
  4. 逻辑运算符(&&,||,!)
  5. 条件运算符(?:)
  6. 位运算符(~,|,^,&,^~)
  7. 移位运算符(<<,>>)
  8. 拼接运算符({ })

算术运算符

“+”(加法运算符),”-“(减法运算符),”*”(乘法运算符),”/”(除法运算符,如7/3 =2),“%”(取模运算符,也即求余数,如7%3=1,余数为1)

赋值运算符

“=”阻塞赋值,”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行;非阻塞赋值可理解为并行执行,不考虑顺序,在always块语句执行完成后,才进行赋值。如下面的阻塞赋值:

代码如下:激励文件如下

module top(din,a,b,c,clk);

input din;
input clk;
outputreg a,b,c;

always@(posedge clk)
begin
        a = din;
        b = a;
        c = b;
end

endmodule	

`timescale1 ns/1 ns 
module top_tb();
reg din ;
reg clk ;
wire a,b,c ;

initial
begin
  din =0;
  clk =0;
forever
begin
#({
    $random}%100)
    din =~din ;
end
end

always#10 clk =~clk ;

top  t0(.din(din),.a(a),.b(b),.c(c),.clk(clk));
endmodule

可以从仿真结果看到,在clk的上升沿,a的值等于din,并立即赋给b,b的值赋给c。

a18fc02f06d91347d9ee110ebb275593.png

如果改为非阻塞赋值,仿真结果如下,在clk上升沿,a的值没有立即赋值给b,b为a原来的值,同样,c为b原来的值

8415ce6de06f6368cd1265b31d897118.png

可以从两者的RTL图看出明显不同:

d9f1d808ad8a509a99ff016986b7ef20.png

ad5cad10d4d3f56ff3759d2e58c46a08.png

阻塞赋值RTL图非阻塞赋值RTL图

一般情况下,在时序逻辑电路中使用非阻塞赋值,可避免仿真时出现竞争冒险现象;在组合逻辑中使用阻塞赋值,执行赋值语句后立即改变;在assign语句中必须用阻塞赋值。

  • 关系运算符

用于表示两个操作数之间的关系,如a>b,a<b,多用于判断条件,例如:

If (a>=b) q <=1’b1 ;
else q <= 1’b0 ;表示如果a的值大于等于b的值,则q的值为1,否则q的值为0
  • 逻辑运算符

“&&”(两个操作数逻辑与),”||”(两个操作数逻辑或),”!”(单个操作数逻辑非)例如:

If (a>b && c <d) 表示条件为a>b并且c<d; if (!a)表示条件为a的值不为1,也就是0。

  • 条件运算符

“?:”为条件判断,类似于if else,例如assign a = (i>8)?1’b1:1’b0 ;判断i的值是否大于8,如果大于8则a的值为1,否则为0。

  • 位运算符

“~”按位取反,”|”按位或,”^”按位异或,”&”按位与,”^”按位同或,除了”~”只需要一个操作数外,其他几个都需要两个操作数,如a&b,a|b。具体应用在后面的组合逻辑一节中有讲解。

  • 移位运算符

“<<”左移位运算符,”>>”右移位运算符,如a<<1表示,向左移1位,a>>2,向右移两位。

  • 拼接运算符

“{ }”拼接运算符,将多个信号按位拼接,如{a[3:0], b[1:0]},将a的低4位,b的低2位拼接成6位数据。另外,{n{a[3:0]}}表示将n个a[3:0]拼接,{n{1’b0}}表示n位的0拼接。如{8{1’b0}}表示为8’b0000_0000.

  • 优先级别

各种运算符的优先级别如下:

ef281b495ebe36d2b4dc50172dec0373.png

组合逻辑

本节主要介绍组合逻辑,组合逻辑电路的特点是任意时刻的输出仅仅取决于输入信号,输入信号变化,输出立即变化,不依赖于时钟。

  • 与门

在verilog中以“&”表示按位与,如c=a&b,真值表如下,在a和b都等于1时结果才为1,RTL表示如右图

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值