📄 lfsr.vhd
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_signed.all;
use std.textio.all;
entity LFSR is
generic(BitNumber : integer := 32);
port(OutNumberA : out std_logic_vector(BitNumber - 1 downto 0);
OutNumberB : out std_logic_vector(BitNumber - 1 downto 0);
Seed : in std_logic_vector(BitNumber downto 0);
Reset : in std_logic;
Clk : in std_logic);
end LFSR;
architecture behav of LFSR is
signal x : std_logic_vector(BitNumber downto 0);
signal y : std_logic_vector(BitNumber downto 0);
signal cNum : std_logic_vector(BitNumber - 1 downto 1);
signal bNum : integer;
begin
bNum <= BitNumber;
process
file DA : text open write_mode is "DataB.dat";
variable DLine : line;
variable px : std_logic_vector(BitNumber downto 1);
variable py : std_logic_vector(BitNumber downto 1);
begin
wait until Clk = '1' and Clk'event;
if Reset = '0' then
x <= Seed;
y <= Seed + 1;
else
for i in BitNumber - 1 downto 1 loop
px(BitNumber) := x(BitNumber);
px(i) := (x(i) and cNum(i)) xor px(i + 1);
x(0) <= px(1);
x(i) <= x(i - 1);
x(BitNumber) <= x(BitNumber - 1);
end loop;
for i in BitNumber - 1 downto 1 loop
py(BitNumber) := y(BitNumber);
py(i) := (x(i) and cNum(i)) xor py(i + 1);
y(0) <= py(1);
y(i) <= y(i - 1);
y(BitNumber) <= y(BitNumber - 1);
end loop;
OutNumberA <= x(BitNumber downto 1);
OutNumberB <= y(BitNumber downto 1);
write(DLine,CONV_INTEGER(x(BitNumber downto 1)),right,15);
write(DLine,CONV_INTEGER(y(BitNumber downto 1)),right,15);
writeline(DA,DLine);
end if;
end process;
process(bNum)
begin
case bNum is
when 3 =>
cNum <= "10";
when 4 =>
cNum <= "100";
when 5 =>
cNum <= "1000";
when 6 =>
cNum <= "01000";
when 7 =>
cNum <= "100000";
when 8 =>
cNum <= "1000000";
when 9 =>
cNum <= "10001100";
when 10 =>
cNum <= "000100000";
when 11 =>
cNum <= "0010000000";
when 12 =>
cNum <= "01000000000";
when 13 =>
cNum <= "001100100000";
when 14 =>
cNum <= "0110000000001";
when 15 =>
cNum <= "00000000000001";
when 16 =>
cNum <= "000000000010110";
when 17 =>
cNum <= "0000000000000100";
when 18 =>
cNum <= "00000000001000000";
when 19 =>
cNum <= "000000000000110001";
when 20 =>
cNum <= "0000000000000000100";
when 21 =>
cNum <= "00000000000000000010";
when 22 =>
cNum <= "000000000000000000001";
when 23 =>
cNum <= "0000000000000000010000";
when 24 =>
cNum <= "00000000000000000001101";
when 25 =>
cNum <= "000000000000000000000100";
when 26 =>
cNum <= "0000000000000000011000001";
when 27 =>
cNum <= "00000000000000000011000001";
when 28 =>
cNum <= "000000000000000000000000100";
when 29 =>
cNum <= "0000000000000000000000000010";
when 30 =>
cNum <= "00000000000001100000000000001";
when 31 =>
cNum <= "000000000000000000000000000100";
when 32 =>
cNum <= "0001100000000000000000000000001";
when 33 =>
cNum <= "00000000000000000001000000000000";
when 34 =>
cNum <= "000000000000000000110000000000001";
when 35 =>
cNum <= "0000000000000000000000000000000010";
when 36 =>
cNum <= "00000000000000000000000010000000000";
when others =>
end case;
end process;
end behav;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -