当前位置:   article > 正文

FPGA学习-VHDL和Verilog中数组定义、初始化、赋值方法_verilog数组赋值

verilog数组赋值

原文作者:FPGA设计论坛 

       VHDL和Verilog数组的定义、初始化、赋值的方法不只一种,以下是本人常用的方法,可能不是最方便的,但是比较好理解,文中包含了源代码和modelsim仿真,供大家参考学习。

1. VHDL数组定义、初始化、赋值

1)VHDL数组定义

        方法:通过TYPE定义个matri_index的数组,数组包含50个数据,数据位数为16;申明了receive_data和send_data两个matri_index的数据。

  1. --define a 16 bit array    
  2. constant    matrix_num:      integer := 49
  3. TYPE        matrix_index is array (matrix_num downto 0) of std_logic_vector(15 downto 0);
  4. signal      receive_data,  send_data:    matrix_index;
  5. signal      send_cnt:   STD_LOGIC_VECTOR(7 downto 0);

2)VHDL数组初始

        方法:实际应用里,通常需要在上电复位过程中对变量进行初始化,如果数组个数少时,直接赋初始值即可,但是数组个数多时,可以用循环实现赋值,通常的循环语句有FOR LOOP和WHILE LOOP。(注意变量i申明的位置,需要在process内部,注意变量的赋值方式)

  1. process(clk,reset_n) 
  2.     --循环变量定义并初始化
  3.     variable i: integer := 0;
  4.     begin 
  5.       if (reset_n = '0')then 
  6.         i := 0;  
  7.         --利用while loop循环赋值
  8.         while(i<=matrix_num) loop 
  9.           receive_data(i) <=X"0000";
  10.           i := i+1;
  11.         end loop;
  12.       elsif (rising_edge(clk)) then
  13.         --CONV_std_logic_vector(A,位宽)  将无符号的无符号整数转换为std_logic_vector
  14.         --CONV_INTEGER(A)                将std_logic_vector转换为整数 
  15.         --直接赋值方式
  16.         send_cnt<= X"02";
  17.         send_data(0) <= X"0000";
  18.         send_data(1) <= X"0000"
  19.         send_data(CONV_INTEGER(send_cnt)) <= X"0000";
  20.       end if;
  21. end process;

3)VHDL数组赋值

       赋值语句分信号赋值语句和变量赋值语句两种。每一种都有下面三个基本组成部分:赋值目标:是所赋值的受体,它的基本元素只能是信号或变量。赋值符号:是赋值符号只有两种。一种是信号赋值符号”<=”;另一种是变量赋值符号”:=”。赋值源:赋值源是赋值的主体,它可以是一个数值,也可以是一个逻辑或运算表达式。

       可以直接赋值,如果变量为矢量时,需要将矢量转为整型。(不管三七二十一,建议程序中增加以下包,否则类型转换用不了)

  1. LIBRARY ieee;
  2. USE ieee.std_logic_1164.all;
  3. USE ieee.std_logic_arith.all;
  4. USE ieee.std_logic_unsigned.all;
  5. --CONV_std_logic_vector(A,位宽)  将无符号的无符号整数转换为std_logic_vector
  6. --CONV_INTEGER(A)                将std_logic_vector转换为整数 
  7. --直接赋值方式
  8. send_cnt<= X"02";
  9. send_data(0) <= X"0000";
  10. send_data(1) <= X"0000"
  11. send_data(CONV_INTEGER(send_cnt)) <= X"0000";

4)VHDL数组test代码

  1. LIBRARY ieee;
  2. USE ieee.std_logic_1164.all;
  3. USE ieee.std_logic_arith.all;
  4. USE ieee.std_logic_unsigned.all;
  5. --this is comment
  6. ENTITY array_test IS
  7.   PORT(
  8.     reset_n      : IN     STD_LOGIC; 
  9.     clk         : IN     STD_LOGIC
  10.   );    
  11. END array_test;
  12. ARCHITECTURE behavioural OF array_test IS
  13. --define a 16 bit array    
  14. constant    matrix_num:      integer := 49
  15. TYPE        matrix_index is array (matrix_num downto 0) of std_logic_vector(15 downto 0);
  16. signal      receive_data,  send_data:    matrix_index;
  17. signal      send_cnt:   STD_LOGIC_VECTOR(7 downto 0);
  18. BEGIN
  19. process(clk,reset_n
  20.     --循环变量定义并初始化
  21.     variable i: integer := 0;
  22.     begin 
  23.       if (reset_n = '0')then 
  24.         i := 0;  
  25.         --利用while loop循环赋值
  26.         while(i<=matrix_num) loop 
  27.           receive_data(i) <=X"0000";
  28.           i := i+1;
  29.         end loop;
  30.       elsif (rising_edge(clk)) then
  31.         --CONV_std_logic_vector(A,位宽)  将无符号的无符号整数转换为std_logic_vector
  32.         --CONV_INTEGER(A)                将std_logic_vector转换为整数 
  33.         --直接赋值方式
  34.         send_cnt<= X"02";
  35.         send_data(0) <= X"0000";
  36.         send_data(1) <= X"0000"
  37.         send_data(CONV_INTEGER(send_cnt)) <= X"0000";
  38.       end if;
  39. end process;
  40. END behavioural;

5)modesim 仿真结果

2. Verilog数组定义、初始化、赋值

1)Verilog数组定义

        方法:reg[n-1 : 0] 定义了存储器中每个寄存器单元的大小,即存储单元是一个n位的寄存器;存储器后面的[m-1 : 0]则定义了该存储器中有多少个这样的寄存器。

  1. reg[n-1 : 0] 存储器名 [m-1 : 0];或者 reg[n : 1] 存储器名 [m : 1];
  2. //define a 16 bit array 
  3. parameter wordsize = 16, memsize = 49;
  4. reg [wordsize-1 : 0] send_data[memsize-1 : 0], receive_data[memsize-1 : 0];
  5. integer i = 0;
  6. reg [7:0] send_cnt;

2)Verilog数组初始

        方法:实际应用里,通常需要在上电复位过程中对变量进行初始化,如果数组个数少时,直接赋初始值即可,但是数组个数多时,可以用循环实现赋值,通常的循环语句有FOR和WHILE。(注意变量的赋值方式)

  1. always@(posedge clk, reset_n)
  2. begin
  3. if(!reset_n) begin
  4. while(i <=memsize)
  5. begin
  6. receive_data[i] <= 16'h0000;
  7. i = i+1; //阻塞赋值
  8. end
  9. end
  10. else 
  11. begin
  12. //直接赋值方式
  13. send_cnt <= 8'h02;
  14. send_data[0] <= 16'h0000;
  15. send_data[1] <= 16'h0000;
  16. send_data[send_cnt] <=16'h0000; //不需要类型转换
  17. end
  18. end

3)Verilog数组赋值

        不像VHDL那样,可以直接赋值。

  1. //直接赋值方式
  2. send_cnt <= 8'h02;
  3. send_data[0] <= 16'h0000;
  4. send_data[1] <= 16'h0000;
  5. send_data[send_cnt] <=16'h0000; //不需要类型转换

4)Verilog数组test代码

  1. module verilog_test(clk,reset_n);
  2. input clk;
  3. input reset_n;
  4. // ///
  5. //define a 16 bit array 
  6. parameter wordsize = 16, memsize = 49;
  7. reg [wordsize-1 : 0] send_data[memsize-1 : 0], receive_data[memsize-1 : 0];
  8. integer i = 0;
  9. reg [7:0] send_cnt;
  10. always@(posedge clk, reset_n)
  11. begin
  12. if(!reset_n) begin
  13. while(i <=memsize)
  14. begin
  15. receive_data[i] <= 16'h0000;
  16. i = i+1; //非阻塞赋值
  17. end
  18. end
  19. else 
  20. begin
  21. //直接赋值方式
  22. send_cnt <= 8'h02;
  23. send_data[0] <= 16'h0000;
  24. send_data[1] <= 16'h0000;
  25. send_data[send_cnt] <=16'h0000; //不需要类型转换
  26. end
  27. end
  28. endmodule

5)modelsim仿真结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/432372
推荐阅读
相关标签
  

闽ICP备14008679号