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输出即可。
总结
- 对于一个函数
输入是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