Verilog 数据类型调用

在Verilog中,reg类型用于时序逻辑,通常在always块内赋值,而wire类型用于组合逻辑,通过assign赋值。模块实例化时,输出可以是wire或reg,取决于逻辑类型。当顶层模块的Led定义为reg并导致错误时,应改为wire,因为led_flash模块已将其定义为reg并存储状态。模块间连接主要用wire类型,不含always块的逻辑则使用wire。
摘要由CSDN通过智能技术生成

Verilog 数据类型调用报错(E:/FPGACode/uart_rx_test_led)

uart_rx_test_led 模块调用 led_flash 模块 输出Led。那Led的类型如何定义?

module uart_rx_test_led(
    input Clk,
    input Reset_n,
    input uart_rx,
    output reg [7:0] Led,//Led应该是什么类型?
    output Rx_Done
    );
    wire [7:0] ctrl;
    wire [31:0] time_set;
    wire [7:0] rx_data;

    led_flash led_flash(
	.clk(Clk),
	.reset_n(Reset_n),
	.ctrl(ctrl),
	.Time(time_set),
    .led(Led)//映射
    );
    uart_byte_rx uart_byte_rx(uart_rx,Clk,Reset_n,3'd4,rx_data,Rx_Done);
    uart_cmd uart_cmd(rx_data,Rx_Done,Clk,Reset_n,ctrl,time_set);

endmodule

此时我选择定义顶端函数的Led输出为reg型,因为调用模块的Led是reg型。但是出现以下报错:

module led_flash(
	input clk,
	input reset_n,
	input [7:0] ctrl,
	input [31:0] Time,
    output reg [7:0] led
    );

报错

在这里插入图片描述
即Led类型不对
将Led改成wire类型即可

分析

reg类型已经在flash里面定义过一次reg,不需要再进行再次定义。已经输出存储在寄存器中,接下来只需要通过wire输出即可。

总结

  1. 对于一个函数
    输入是wire 输出可以是wire 或者reg(看是组合逻辑还是时序逻辑)
    always块中只能是对reg类型进行赋值,assign对wire类型进行赋值。因为always 块会自动产生时序逻辑,而 reg 类型变量可以存储状态并表示时序逻辑。而 wire 类型通常用于建立模块之间的连接或连接到模块的端口,不可以用在含有时序逻辑的 always 块中进行赋值。
module Example(input a, input b, output reg c, output d);
  // 对 reg 类型变量进行赋值
  always @(a or b) begin
    if (a & b)
      c <= 1;
    else
      c <= 0;
  end
  
  // 对 wire 类型变量进行赋值
  assign d = a & b;
endmodule

2.对于模块例化
都是wire类型,都是通过模块之间的连接,不需要寄存器存储。
内部只要不涉及alway块赋值,都是wire类型
3.仿真激励函数
输入 reg
输出 wire

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值