Vhdl 带负载和启用信号的左移位寄存器
我正在制作一个程序,将4位二进制寄存器的内容向左移位。如果输入0101,它将给出1010 预期工作时间:Vhdl 带负载和启用信号的左移位寄存器,vhdl,Vhdl,我正在制作一个程序,将4位二进制寄存器的内容向左移位。如果输入0101,它将给出1010 预期工作时间: 如果启用为“1”且加载为“1”,则应读取数据_in并将值计入aux。但不是转移 如果ENABLE为“1”,LOAD为“0”,则aux变量的值应向左移动 如果ENABLE为“0”,则它不会执行任何操作 实际结果: 一切正常,除非启用为“1”且加载为“0”,否则不会移动值 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; USE IEEE.NUMERIC
- 如果启用为“1”且加载为“1”,则应读取数据_in并将值计入aux。但不是转移
- 如果ENABLE为“1”,LOAD为“0”,则aux变量的值应向左移动
- 如果ENABLE为“0”,则它不会执行任何操作
一切正常,除非启用为“1”且加载为“0”,否则不会移动值
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.all;
USE IEEE.NUMERIC_STD.all;
ENTITY shift_left IS
GENERIC (num_bits:POSITIVE:= 4);
PORT (
clk: IN STD_LOGIC;
enable: IN STD_LOGIC;
load: IN STD_LOGIC;
data_in: IN UNSIGNED (num_bits -1 DOWNTO 0);
data_out: OUT UNSIGNED (num_bits -1 DOWNTO 0));
END shift_left;
ARCHITECTURE behaviour OF shift_left IS
BEGIN
PROCESS
variable aux: UNSIGNED(num_bits-1 downto 0);
BEGIN
WAIT UNTIL RISING_EDGE (clk);
IF enable = '1' THEN
IF load = '1' THEN
aux := data_in;
ELSE
FOR i IN num_bits-2 TO 0 LOOP
aux(i+1) := aux(i);
END LOOP;
aux(0) := '0';
END IF;
END IF;-- enable
data_out <= aux;
END PROCESS;
END behaviour;
IEEE库;
使用IEEE.STD_LOGIC_1164.all;
使用IEEE.NUMERIC_STD.all;
实体左移为
通用(位数:正:=4);
港口(
clk:标准逻辑中;
启用:在STD_逻辑中;
负载:在标准逻辑中;
数据输入:无符号(num_位-1到0);
数据输出:输出无符号(数字位-1到0);
左移结束;
左移位的架构行为是
开始
过程
变量aux:无符号(num_bits-1到0);
开始
等待上升沿(clk);
如果enable='1',则
如果加载='1',则
aux:=数据输入;
其他的
对于num_位-2到0循环中的i
辅助(i+1):=辅助(i);
端环;
辅助(0):=“0”;
如果结束;
如果结束;——使可能
数据显示你是如何测试代码的,因为在我看来它是正常的。设计,而不是程序。您的实体/体系结构本身不会复制问题。这不是一个好主意。IEEE Std 1076-2008 5.2标量类型,5.2.1概述第4段(部分):“L到R的范围称为升序范围;如果L>R,则范围为空范围。”空范围指定的值子集为空。(for循环迭代方案中的一个印刷错误,保留字to
应该是downto
,即for i in num_bits-2 downto 0循环
。另一种实现移位的方法是aux:=aux(num_bits-2 downto)和'0';
@我正在使用Quartus II和模型sim加上一个测试程序。