• VHDL和Verilog中数组定义、初始化、赋值方法


    0. 前言

            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;
    1. --CONV_std_logic_vector(A,位宽) 将无符号的无符号整数转换为std_logic_vector
    2. --CONV_INTEGER(A) 将std_logic_vector转换为整数
    3. --直接赋值方式
    4. send_cnt<= X"02";
    5. send_data(0) <= X"0000";
    6. send_data(1) <= X"0000";
    7. 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;

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

    1)Verilog数组定义

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

    reg[n-1 : 0] 存储器名 [m-1 : 0]; 或者 reg[n : 1] 存储器名 [m : 1];

    1. //define a 16 bit array
    2. parameter wordsize = 16, memsize = 49;
    3. reg [wordsize-1 : 0] send_data[memsize-1 : 0], receive_data[memsize-1 : 0];
    4. integer i = 0;
    5. 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; //不需要类型转换




     

  • 相关阅读:
    海量数据处理方法归纳
    读书笔记|指数型函数对算法的影响实际应用-day3
    建站选择免费虚拟主机的六大误区
    Docker 学习笔记总结(一)
    sqlmap 攻击
    GPTZero:论文打假神器
    十分钟带你入门向量检索技术
    分布式(二)-大型网站架构演化发展历程
    十字光标太小怎么调节、CAD梦想画图算量技巧
    算法之迪杰斯特拉(dijkstra)形象化
  • 原文地址:https://blog.csdn.net/qq_33300585/article/details/133798393