Arrays 确定矩阵中列的长度
我要确定4x4矩阵中每列的长度。每列的长度从每列的底部向上计数,仅从开始访问的“1”开始计数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
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;