文章目录
数据类型
HDL语言有三种数据类型:寄存器数据类型(reg)、线网数据类型(wire)、参数数据类型(parameter)。
根本区别
-
reg:
寄存器类型,要有触发,才会响应。变量可以保持它们自身的数值,直到该变量被指定了新的值为止。在过程赋值语句中,表达式右侧的计算结果在某种条件的触发下放到一个变量当中,而这个变量可以声明成reg类型的。根据触发条件的不同,过程赋值语句可以建模不同的硬件结构:如果这个条件是时钟的上升沿或下降沿,那么这个硬件模型就是一个触发器;如果这个条件是某一信号的高电平或低电平,那么这个硬件模型就是一个锁存器;如果这个条件是赋值语句右侧任意操作数的变化,那么这个硬件模型就是一个组合逻辑。
-
wire:
-只要输入有变化,输出就无条件的立即发生变化。表示元件间的物理连线,不能保存数据。使用在连续赋值语句中,表达式右侧的计算结果可以立即更新表达式的左侧。在理解上,相当于一个逻辑之后直接连了一条线,这个逻辑对应于表达式的右侧,而这条线就对应于wire。
什么时候要定义wire
-
assign 语句的输出
wire为无逻辑连线。只做连线,wire本身是不带逻辑性的,所以输入什么输出就是什么。所以你尝试着用always语句对wire变量赋值。综合器就会报错。
assign c =a&&b:综合器综合时将a&&b综合成ab经过一个与门。而c只是连接到与门输出的线。真正综合出与门的是&&。而不是c。 -
元件例化时候的顶层输出
(例如这里的rst_filter)//将呼吸灯模块通过例化到顶层
module top_breath_led(
input clk,
input rst,output led1, //2s output led2 //4s
);
wire rst_filter; // 按键消抖后的值
// 实例化按键消抖模块
keydebounce u_keydebounce (
.clk(clk),
.rst(rst),
.rst_filter(rst_filter)
);// 实例化呼吸灯模块
// 2s
breath_led #(
.CNT_2US_MAX(7'd100),
.CNT_2MS_MAX(10'd1000),
.CNT_2S_MAX(10'd1000)
) u_breath_led1(
.clk(clk),
.rst(rst_filter),
.led(led1)
);// 4s
breath_led #(
.CNT_2US_MAX(8'd200),
.CNT_2MS_MAX(10'd1000),
.CNT_2S_MAX(10'd1000)
) u_breath_led2(
.clk(clk),
.rst(rst_filter),
.led(led2)
);endmodule
-
输入信号
输入信号一般来说你是不知道上一级是寄存器输出还是组合逻辑输出,那么对于本级来说就是一根导线,也就是wire型。
小结
简单介绍了一下wire和reg类型的区别,对于新手来说很容易混淆。
如有任何问题可以联系邮箱:zelinliu@nuaa.edu.cn