Components 移位BCD位时的VHDL问题

Components 移位BCD位时的VHDL问题,components,vhdl,hardware,Components,Vhdl,Hardware,我创建了一个移位寄存器,一次移位4位,因为我给它一个BCD 3位数字作为输入,每个数字由4位表示,比如说876表示为100001110110 在代码中,我给它一个临时变量,它保存所有的位,然后在我将所有位向右移位4位后,在最左边的4位重新分配删除的位 例如:1000011101110——换班前 0110100000111——班后 我希望我的输出是移位后的新12位数字(0110100000111)和“移位”后的4位数字(0110) 以下是代码: library ieee; use ieee.std

我创建了一个移位寄存器,一次移位4位,因为我给它一个BCD 3位数字作为输入,每个数字由4位表示,比如说876表示为100001110110

在代码中,我给它一个临时变量,它保存所有的位,然后在我将所有位向右移位4位后,在最左边的4位重新分配删除的位

例如:1000011101110——换班前 0110100000111——班后 我希望我的输出是移位后的新12位数字(0110100000111)和“移位”后的4位数字(0110)

以下是代码:

library ieee; use ieee.std_logic_1164.all;
          use ieee.std_logic_arith.all;
          use ieee.std_logic_unsigned.all;

entity SR4B is 
    port(CLK: IN STD_LOGIC;
         EN : IN STD_LOGIC;
         I_DATA: IN STD_LOGIC_VECTOR(11 DOWNTO 0);
         O_DATA: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
         N_DATA: OUT STD_LOGIC_VECTOR(11 DOWNTO 0));
end SR4B;

architecture SR4BA of SR4B is

    begin

        process(CLK)
        variable tempv: STD_LOGIC_VECTOR(11 DOWNTO 0);
        variable test_variable: STD_LOGIC_VECTOR(11 DOWNTO 0);
        begin
            tempv := I_DATA;
            if (EN = '1') then
                if CLK'event and CLK = '1' then
                    O_DATA <= tempv(3 DOWNTO 0);
                    for i in 0 to 3 loop
                        test_variable(i) := tempv(i+4);
                        test_variable(i+4) := tempv(i+8);
                    end loop;
                    test_variable(11 DOWNTO 8) := tempv(3 DOWNTO 0);
                    tempv := test_variable;
                end if;
            else
                N_DATA <= I_DATA;
            end if;
        end PROCESS;

end SR4BA;

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; 
          use ieee.std_logic_unsigned.all;

entity SR4BT is
end SR4BT;

architecture SR4BTA of SR4BT is
    component SR4B 
        port(CLK: IN STD_LOGIC;
                 EN : IN STD_LOGIC;
                 I_DATA: IN STD_LOGIC_VECTOR(11 DOWNTO 0);
                 O_DATA: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
             N_DATA: OUT STD_LOGIC_VECTOR(11 DOWNTO 0));
    end component;

    signal CLK : STD_LOGIC := '1';
    signal EN  : STD_LOGIC := '1';
    signal I_DATA: STD_LOGIC_VECTOR(11 DOWNTO 0) := "100001110110";
    signal O_DATA1: STD_LOGIC_VECTOR(3 DOWNTO 0);
    signal O_DATA2: STD_LOGIC_VECTOR(3 DOWNTO 0);
    signal O_DATA3: STD_LOGIC_VECTOR(3 DOWNTO 0);
    signal N1 : STD_LOGIC_VECTOR(11 DOWNTO 0);
    signal N2 : STD_LOGIC_VECTOR(11 DOWNTO 0);
    signal N3 : STD_LOGIC_VECTOR(11 DOWNTO 0);

    begin
        u1 : SR4B port map(CLK,EN,I_DATA,O_DATA1,N1);
        u2 : SR4B port map(CLK,EN,N1,O_DATA2,N2);
        u3 : SR4B port map(CLK,EN,N2,O_DATA3,N3);

        PROCESS(CLK)    
        BEGIN
        CLK <= not CLK after 5 ns;
        END PROCESS;
end SR4BTA;
ieee库;使用ieee.std_logic_1164.all;
使用ieee.std_logic_arith.all;
使用ieee.std_logic_unsigned.all;
实体SR4B是
端口(时钟:在标准逻辑中;
EN:标准逻辑;
I_数据:标准逻辑向量(11到0);
O_数据:输出标准逻辑向量(3到0);
N_数据:输出标准逻辑向量(11到0);
结束SR4B;
SR4B的体系结构SR4BA是
开始
过程(CLK)
变量tempv:STD_逻辑_向量(11到0);
变量测试变量:标准逻辑向量(11到0);
开始
tempv:=I_数据;
如果(EN='1'),则
如果CLK'事件和CLK='1',则

O_数据我读到的真正问题是“为什么在我模拟时,它会在任何地方都给我X”如果你在stackoverflow中搜索“模拟中的X”,你会得到约3000个点击,其中95%的点击都有相同的原因:没有初始化或重置我已经在任何地方搜索过了,这就是为什么我把它贴在这里好:你的变量没有初始化或重置。在HDL中,重置是最简单的。我现在明白了,谢谢,它解决了所有问题。