VERILOG 模块

模块

Verilog设计组件由一个模块表示。必须声明模块,并且实例化。

模块声明

•行为Verilog模块声明包括:

○ 模块名称

○ 电路I/O端口列表

○ 用于定义预期功能的模块主体

•以endmodule语句结束。

电路I/O端口

•电路I/O端口列在模块声明中。

•每个电路I/O端口的特征在于:

○ 一个名字

○ A模式:输入、输出、输入

○ 如果端口为阵列类型,则范围信息。

Behavioral Verilog Module Declaration Example One
module example (A, B, O);
input A, B;
output O;
assign O = A & B;
endmodule
Behavioral Verilog Module Declaration Example Two
module example ( input A, inputB, output O
);
assign O = A & B;
endmodule

模块实例化

行为Verilog模块实例化语句执行以下操作:

•定义实例名称。

•包含端口关联列表。端口关联列表指定实例的方式连接在父模块中。端口关联列表的每个元素都将的一个正式端口连接起来模块声明到父模块的实际网络。

•在另一个模块中实例化。请参见以下编码示例。

Behavioral Verilog Module Instantiation Example
module top (A, B, C, O); input A, B, C; output O;
wire tmp;
example inst_example (.A(A), .B(B), .O(tmp));
assign O = tmp | C;
endmodule

持续赋值语句

Vivado合成支持显式和隐式连续赋值。

•连续分配以简洁的方式对组合逻辑进行建模。

•Vivado综合忽略了连续任务的延迟和强度。

•仅允许在有线和三数据类型上进行连续分配。

显式连续赋值

显式连续赋值在网络被分开后以assign关键字开始宣布。

有线mysignal;

...

assign mysignal=选择?b:a;

隐式连续赋值

隐式连续赋值结合了声明和赋值。

导线错误信号=a|b;

程序分配

•行为Verilog程序分配:

○ 为声明为reg的变量赋值。

○ 总是由块、任务和函数引入。

○ 模型寄存器和有限状态机(FSM)组件。

•Vivado合成支持:

○ 组合函数

○ 组合任务和顺序任务

○ 组合和顺序总是块

组合总是块

组合逻辑通过Verilog时间控制语句有效地建模:

•延迟时间控制声明[#]

•事件控制时间控制语句[@]

延迟时间控制声明

延迟时间控制语句[#(磅)]为:

•仅与模拟相关。

•忽略合成。

有关Vivado模拟的Verilog格式的更多信息,请参阅Vivado Design Suite用户指南:

逻辑仿真(UG900)。

事件控制时间控制语句

以下语句描述了使用事件控制时间对组合逻辑进行建模

控制语句[@(at)]。

•组合总是块的灵敏度列表出现在后面的括号内

always@.

•如果事件(值更改或边缘)出现在其中一个

灵敏度列表信号。

•敏感度列表可以包含:

○ 在条件下出现的任何信号,如if或case。

○ 出现在任务右侧的任何信号。

•通过用括号中的*(星号)代替信号列表,始终块为针对如所述的任何总是块的信号中的事件而激活。

•在组合过程中,如果信号没有在if或case的所有分支中明确分配

语句,Vivado synthesis生成一个锁存器来保存最后一个值。

•流程中使用以下语句:

○ 变量和信号分配

○ if-else语句

○ 案例陈述

○ for while循环语句

○ 函数和任务调用

使用if-else语句

Vivado合成支持if-else语句。

•if-else语句使用true和false条件来执行语句。

○ 如果表达式的计算结果为true,则执行第一条语句。

○ 如果表达式的计算结果为false、x或z,则执行else语句。

•使用开始和结束关键字执行多个语句块。

•if-else语句可以嵌套。

if-else语句示例

此编码示例使用if-else语句来描述多路复用器。

module mux4 (sel, a, b, c, d, outmux);
input [1:0] sel;
input [1:0] a, b, c, d;
output [1:0] outmux;
reg [1:0] outmux;
always @(sel or a or b or c or d)
begin
if (sel[1])
if (sel[0])
outmux = d;
else
else
outmux = c;
if (sel[0])
outmux = b;
end endmodule
else
outmux = a;

案例说明

Vivado综合支持案例陈述。

•case语句与表达式进行比较,以评估几个并行语句中的一个分支机构。

○ case语句按照分支的编写顺序对其进行求值。

○ 执行计算结果为true的第一个分支。

○ 如果没有一个分支匹配,则执行默认分支。

•在case语句中不要使用无大小写整数。始终将整数大小调整为特定数量位。否则,结果可能是不可预测的。

•casez将分支备选方案的任何位位置中的所有z值视为“不在乎”。

•casex将分支备选方案的任何位位置中的所有x和z值视为“不在乎”。

•在casez或casex的情况下,问号(?)可以用作“不在乎”声明。

多路复用器案例说明示例(Verilog)

Filename: top.v
// Multiplexer using case statement
module mux4 (sel, a, b, c, d, outmux);
input [1:0] sel;
input [1:0] a, b, c, d;
output [1:0] outmux;
reg [1:0] outmux;
always @ *
begin
case(sel)
2'b00 : outmux = a;
2'b01 : outmux = b;
2'b10 : outmux = c;
2'b11 : outmux = d;
endcase
end
endmodule

避免优先级处理

•上一个编码示例中的case语句评估输入sel的值优先顺序。

•为了避免优先处理:

○ 使用并行情况Verilog属性来确保对输入sel进行并行评估。

○ 将案例陈述替换为:

(*parallel_case*)大小写(sel)

For和Repeat语句

Vivado综合支持和重复语句。使用始终块时,重复

或位片结构也可以使用for语句或repeat语句来描述。

使用For语句

常量绑定支持for语句,并使用以下命令停止测试条件

运算符:<,<=,>,>=。

对于属于以下情况之一的下一步计算,也支持for语句

规格:

•var=var+步骤

•var=var-step其中:

○ var是循环变量

○ 步长是一个常数值

重复语句

只有常数值才支持repeat语句。

使用While循环

当使用总是块时,请使用while循环来执行重复的过程。

•while循环:

○ 如果测试表达式最初为false,则不执行。

○ 执行其他语句,直到其测试表达式变为false。

•测试表达式是任何有效的Verilog表达式。

•要防止无休止的循环,请使用-loop_iteration_limit选项。

•while循环可以有disable语句。disable语句用于标记为块,如以下代码片段所示:

disable <blockname>
Example of While Loop
parameter P = 4; always @(ID_complete) begin : UNIDENTIFIED
integer i; reg found; unidentified = 0; i = 0;
found = 0;
while (!found && (i < P))
begin
found = !ID_complete[i];
unidentified[i] = !ID_complete[i];
i = i + 1;
end

使用顺序始终块

Vivado合成支持顺序始终块。

•描述一个具有始终块和灵敏度列表的顺序电路,其中包含

以下边缘触发(带有posedge或negedge)事件:

○ 强制性时钟事件

○ 可选设置/重置事件(建模异步设置/重置控制逻辑)

•如果没有描述可选的异步信号,则始终块的结构如下:

always @(posedge CLK) begin
<synchronous_part> end
• If optional asynchronous control signals are modeled, the always block is structured as
follows:
always @(posedge CLK or posedge ACTRL1 or à ) begin
if (ACTRL1)
<$asynchronous part> else
<$synchronous_part> end
Sequential Always Block Examples
This coding example describes an 8-bit register with a rising-edge clock. There are no other
control signals.
module seq1 (DI, CLK, DO);
input [7:0] DI;
input CLK;
output [7:0] DO;
reg [7:0] DO;
always @(posedge CLK) DO <= DI ;
endmodule
The following code example adds an active-High asynchronous reset.
module EXAMPLE (DI, CLK, ARST, DO);
input [7:0] DI;
input CLK, ARST;
output [7:0] DO;
reg [7:0] DO;
always @(posedge CLK or posedge ARST)
if (ARST == 1'b1)
DO <= 8'b00000000;
else
DO <= DI;
endmodule
The following code example describes an active-High asynchronous reset and an active-Low
asynchronous set:
module EXAMPLE (DI, CLK, ARST, ASET, DO);
input [7:0] DI;
input CLK, ARST, ASET;
output [7:0] DO;
reg [7:0] DO;
always @(posedge CLK or posedge ARST or negedge ASET)
if (ARST == 1'b1)
DO <= 8'b00000000;
elsif (ASET == 1'b1) DO <= 8'b11111111;
else
DO <= DI;
endmodule
The following code example describes a register with no asynchronous set/reset, and a
synchronous reset.
module EXAMPLE (DI, CLK, SRST, DO);
input [7:0] DI;
input CLK, SRST;
output [7:0] DO;
reg [7:0] DO;
always @(posedge CLK)
if (SRST == 1'b1)
DO <= 8'b00000000;
else
DO <= DI;
endmodule

使用分配和取消分配语句

Vivado synthesis不支持assign和deassign语句。

超过32位的分配扩展

如果赋值左侧的表达式比右侧的表达式宽,则根据以下规则将左侧填充到左侧:

•如果右侧表达式带有符号,则左侧表达式将填充符号位。

•如果右侧表达式为无符号表达式,则左侧表达式将填充0(零)。

•仅适用于无尺寸的x或z常数,以下规则适用:

如果右边表达式的最左边比特的值是z(高阻抗)或x(未知),

无论右边的表达式是有符号的还是无符号的,左边的表达式都是

填充该值(分别为z或x)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cckkppll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值