Arrays 确定矩阵中列的长度

Arrays 确定矩阵中列的长度,arrays,matrix,vhdl,counter,Arrays,Matrix,Vhdl,Counter,我要确定4x4矩阵中每列的长度。每列的长度从每列的底部向上计数,仅从开始访问的“1”开始计数 1110 0111 0110 0001 第1列=1,第2列=3,第3列=3,第4列=4等等 有人知道我该怎么做吗?到目前为止,我已经尝试在提取每个列的函数旁边生成一个矩阵 type col_mat is array (0 to 3) of std_logic; type matrix is array (0 to 3, 0 to 3) of std_logic; signal M: matri

我要确定4x4矩阵中每列的长度。每列的长度从每列的底部向上计数,仅从开始访问的“1”开始计数

1110   
0111
0110
0001
第1列=1,第2列=3,第3列=3,第4列=4等等

有人知道我该怎么做吗?到目前为止,我已经尝试在提取每个列的函数旁边生成一个矩阵

type col_mat is array (0 to 3) of std_logic;
type matrix is array (0 to 3, 0 to 3) of std_logic;

signal M: matrix;
signal temp_col : col_mat;
signal count    : unsigned (1 downto 0):= "00"; 

function extract_col(x: matrix; column : integer) return col_mat is
variable ret: col_mat;
begin 
    for i in col_mat'range loop 
        ret(i) := x(i,column)
    end loop;
    return ret; 

end function;

begin
    if rising_edge(clk) then 
         temp_col<= extract_col(M, to_integer(count) );
         count <= count+1;
    end if;
end process;
类型col_mat是标准逻辑的数组(0到3);
类型矩阵是std_逻辑的数组(0到3,0到3);
信号M:矩阵;
信号温度柱:柱垫;
信号计数:无符号(1到0):=“00”;
函数extract\u col(x:matrix;column:integer)返回col\u mat为
变量ret:col_mat;
开始
对于col_mat'range循环中的i
ret(i):=x(i,列)
端环;
返回ret;
末端功能;
开始
如果上升沿(clk),则

temp_col您描述的是一个优先级编码器,从外观上看,您是在暗示它在一个时钟中工作,根据目标设备(假设您要合成),它可能会达到某个时钟速率限制

优先级编码可以是if语句、case语句、带出口的循环语句(如Martin Zabel所评论的),用逻辑运算符或条件信号分配组合描述

对于这个特殊的用法,循环语句是最紧凑的,并且已经添加到您的进程中

以下代码源于您的问题,并充实为

结果以数组类型索引的形式显示(从0开始)

我为count named column添加了一个管道寄存器,并为一个信号添加了寄存器,以指定找到了一个“1”(find_1),并且在其中找到了一个“1”的最高行值(想象命名的行):

ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体列为
终端实体;
列的架构foo是
COLU mat类型是标准逻辑的数组(0到3);
类型矩阵是std_逻辑的数组(0到3,0到3)——(行、列)
--信号M:矩阵;
-- 1110
-- 0111
-- 0110
-- 0001
--
--第1列=1,第2列=3,第3列=3,第4列=4等等。。。
--
--列0=0,列1=2,列2=2,列3=3
--(矩阵定义为(0,0)为左上角)
--正在查找“1”占用的最高列索引
信号M:矩阵:=(-用于演示提供矩阵默认值
('1','1','1','0'),--第0行
('0','1','1','1'),
('0','1','1','0'),
('0','0','0','1')--第3行
);
--信号温度柱:柱垫;
信号计数:无符号(1到0):=“00”;
函数extract\u col(x:matrix;column:integer)返回col\u mat为
变量ret:col_mat;
开始
对于col_mat'range循环中的i
ret(i):=x(i,列);——缺少分号
端环;
返回ret;
末端功能;
--新增信号:
信号时钟:标准逻辑:='1';--上升边()需要0->1个trans
找到信号_1:std_逻辑:='0';
信号列:无符号(1到0);
信号行:0到3的整数范围;
信号矩阵:矩阵矩阵;
开始
未标记:
过程(clk)
可变温度列:列将temp_col设为变量,立即使用
开始
如果上升沿(clk),则
temp_col:=提取_col(M,到_整数(计数));--是信号吗
--优先级编码器:--添加了循环
对于温度列右下至温度列左循环中的i——最高的第一个
如果温度(i)=“1”,则

一行如何有底部和顶部?你是说专栏吗?示例文本使用基于一的索引,但VHDL代码使用基于零的索引。请复习你的问题。我现在已经编辑过了。不是要写行那么,你想在列向量中找到最高的集合位位置吗?一般的方法是:1)反转向量;2) 生成新向量,并将二进制数转换为两个补码;3) 两个向量的逻辑AND=>给出一个热编码值,其中1位于MSB的位置。然后您可以使用一个小的LUT来获得结果。另一种选择是,由于矩阵很小,只需将每个列向量提供给LUT,LUT将对值进行解码。函数
extract\u col
看起来不错。但是,给定的代码示例不进行分析。另一个扫描列的函数怎么样?给你一个指针:你也可以在到达末尾之前退出for循环。我想找到最高的设置位位置,因为我需要找到列的长度。这段代码是更广泛的算法的一部分。实际矩阵要大得多,但这只是一个例子。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity column is
end entity;

architecture foo of column is

    type col_mat is array (0 to 3) of std_logic;
    type matrix is array (0 to 3, 0 to 3) of std_logic;  -- (row,column)

    -- signal M: matrix;

    -- 1110
    -- 0111
    -- 0110
    -- 0001
    --
    -- Column1=1, Column2=3, Column3=3, Column4=4 etc...
    --
    -- column0 = 0, column1 =  2 column2 = 2, column3 = 3
    --  (matrix is defined so (0,0) is the upper left hand corner)
    --  Looking for the highest column index occupied by a '1'

    signal M:   matrix := (   -- for demo provide matrix default value
                    ('1','1','1','0'),   -- row 0
                    ('0','1','1','1'),
                    ('0','1','1','0'),
                    ('0','0','0','1')    -- row 3
                );

    -- signal temp_col:  col_mat;
    signal count:     unsigned (1 downto 0):= "00"; 

    function extract_col(x: matrix; column:  integer) return col_mat is
    variable ret: col_mat;
    begin 
        for i in col_mat'range loop 
            ret(i) := x(i,column);  -- was missing semicolon
        end loop;
        return ret; 
    end function;

    -- added signals:
    signal clk:     std_logic := '1';  -- rising_edge() requires 0 -> 1 trans
    signal found_1: std_logic := '0';
    signal column:  unsigned (1 downto 0);
    signal row:     integer range 0 to 3;
    signal mat_col: col_mat;
begin

UNLABELED:
    process (clk)
        variable temp_col: col_mat;   -- made temp_col a variable, use immediately
    begin
        if rising_edge(clk) then 
             temp_col := extract_col(M, to_integer(count));  -- was signal
             -- priority encoder:                             -- added loop

             for i in temp_col'RIGHT downto temp_col'LEFT loop -- highest first
                 if temp_col(i) = '1' then
                     found_1 <= '1';
                     column <= count;
                     row <= i;
                     exit;
                 else
                     found_1 <= '0';
                 end if;
             end loop;
             mat_col <= temp_col;  -- added
             count <= count + 1;
        end if;
    end process;

CLOCK:   -- Added clock process
    process
    begin
        wait for 10 ns;
        clk <= not clk;
        if now > 90 ns then
            wait;
        end if;
    end process;
end architecture;