verilog中数组传递的相关技巧

verilog中数组的相关总结

定义

reg[9:0] data[0:10];前面的[]代表数据位宽,后面的[]代表数据个数;

用法

赋值:不能直接两个数组赋值。因为assign 语句不能用于数组的赋值。需要使用一个生成语句或者将数组分解为单独的端口后进行赋值。
		生成语句案例:
		genvar i;
		generate
			for (i = 0; i < 256; i = i + 1) begin : gen_cmd_ports
				assign cmd[i] = data_buffer[i];
			end
		endgenerate
		或者使用for语句
		always @ (*) begin
		if (!rst_n) begin
			for (i = 0; i < 16; i = i+1) begin 
				UART_REG[i] <= 0;
			end
		end else begin
			if (1) 
				UART_REG[num_r] <= cmd_data;
			else
				UART_REG[num_r] <= UART_REG[num_r];
		end
		end
		
		单独端口案例:
		即,将数组拆分成一个个单独的信号。

注意

*在verilog2001中,数组不能用于输入输出的端口定义。如果想要进行放到端口上定义,需要将数组分解成一个个单个的数据。也就是数组是不能直接作为端口在模块中传递的。

技巧

本质上数组就是带有序列信息的一组同位宽的数列。reg[9:0] data[0:10];就是有reg[9:0] data[0]/reg[9:0] data[1]/reg[9:0] data[2]....../reg[9:0] data[9]组成。
为了便于开发和理解,可以将数组理解为轻量化的RAM或者轻量化的寄存器空间。访问一组数组的时候,可以按照访问寄存器的寻址原理来访问。以reg[9:0] data[0:10];为例,地址0就是数据data[0];地址1就是data[1];
综上,如果想将数组reg[9:0] data[0:10]传递到其他模块,又同样不想把数据拆分为data0,data1...data10这11个数据单独传递,可以定义两个信号即可做到数据的传递:data_r[9:0],addr_r[2:0]。内部定义一下这个存储逻辑:
data_r=data[addr_r]

这样在另一个模块里,只要寻址addr_r就可以获得相应位置的数值里只要遍历addr_r的所有值就可以得到一个和数组reg[9:0] data[0:10]一样的新数组reg[9:0] data_new[0:10]
	data_new[addr_r]=data_r
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Verilog,可以使用数组来存储一组变量。可以使用数组来存储多个信号或数据,并对它们进行处理。以下是关于Verilog数组的用法: 1. 申明数组 使用reg或wire类型来申明数组。申明数组时需要指定数组的大小和每个元素的位宽。例如: ``` reg [7:0] my_array [0:3]; ``` 上面的代码定义了一个四个元素的数组,每个元素由8位组成。 2. 初始化数组 可以使用大括号来初始化数组,每个元素用逗号分隔。例如: ``` reg [7:0] my_array [0:3] = '{8'h11, 8'h22, 8'h33, 8'h44}; ``` 上面的代码定义了一个包含四个元素的数组,每个元素的值分别为0x11、0x22、0x33和0x44。 3. 访问数组元素 可以使用下标来访问数组元素。下标从0开始,到数组大小减1结束。例如: ``` reg [7:0] my_array [0:3] = '{8'h11, 8'h22, 8'h33, 8'h44}; reg [1:0] index = 2; //访问数组的第三个元素 reg [7:0] value = my_array[index]; ``` 上面的代码将数组的第三个元素(下标为2)的值给了变量value。 4. 循环访问数组 可以使用for循环来循环访问数组的元素。例如: ``` reg [7:0] my_array [0:3] = '{8'h11, 8'h22, 8'h33, 8'h44}; integer i; for (i = 0; i < 4; i = i + 1) begin $display("my_array[%0d] = %h", i, my_array[i]); end ``` 上面的代码使用for循环访问了数组的所有元素,并输出它们的值。 以上就是Verilog数组的基本用法。需要注意的是,在Verilog数组的使用有一些限制,例如不能在always块使用数组作为敏感信号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值