Components 移位BCD位时的VHDL问题
我创建了一个移位寄存器,一次移位4位,因为我给它一个BCD 3位数字作为输入,每个数字由4位表示,比如说876表示为100001110110 在代码中,我给它一个临时变量,它保存所有的位,然后在我将所有位向右移位4位后,在最左边的4位重新分配删除的位 例如:1000011101110——换班前 0110100000111——班后 我希望我的输出是移位后的新12位数字(0110100000111)和“移位”后的4位数字(0110) 以下是代码: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
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中,重置是最简单的。我现在明白了,谢谢,它解决了所有问题。