发新话题
打印

lfsr的fifo怎么改成verilog的

lfsr的fifo怎么改成verilog的

再做fifo时,看到有关的程序是用lfsr实现的,但是好像lfsr的位数是变化的,源程序VHDL,而对那不是了解,有谁帮忙改一下,verilog的,谢谢

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity atahost_lfsr is
generic(
  TAPS : positive range 16 downto 3 :=8;
  OFFSET : natural := 0
);
port(
  clk : in std_logic;                 -- clock input
  ena : in std_logic;                 -- count enable
  nReset : in std_logic;              -- asynchronous active low reset
  rst : in std_logic;                 -- synchronous active high reset
  
  Q : out unsigned(TAPS downto 1);    -- count value
  Qprev : out unsigned(TAPS downto 1) -- previous count value
);
end entity atahost_lfsr;
architecture dataflow of atahost_lfsr is
function lsb(tap : positive range 16 downto 3; Q : unsigned(TAPS downto 1) ) return std_logic is
begin
  case tap is
   when 3 =>
    return Q(3) xnor Q(2);
   when 4 =>
    return Q(4) xnor Q(3);
   when 5 =>
    return Q(5) xnor Q(3);
   when 6 =>
    return Q(6) xnor Q(5);
   when 7 =>
    return Q(7) xnor Q(6);
   when 8 =>
    return (Q(8) xnor Q(6)) xnor (Q(5) xnor Q(4));
   when 9 =>
    return Q(9) xnor Q(5);
   when 10 =>
    return Q(10) xnor Q(7);
   when 11 =>
    return Q(11) xnor Q(9);
   when 12 =>
    return (Q(12) xnor Q(6)) xnor (Q(4) xnor Q(1));
   when 13 =>
    return (Q(13) xnor Q(4)) xnor (Q(3) xnor Q(1));
   when 14 =>
    return (Q(14) xnor Q(5)) xnor (Q(3) xnor Q(1));
   when 15 =>
    return Q(15) xnor Q(14);
   when 16 =>
    return (Q(16) xnor Q(15)) xnor (Q(13) xnor Q(4));
  end case;
end function lsb;
signal msb : std_logic;
signal iQ : unsigned(TAPS downto 1);
begin
--
-- generate register
--
gen_regs: process(clk, nReset)
  variable tmpQ : unsigned(TAPS downto 1);
  variable tmpmsb : std_logic;
begin
  tmpQ := (others => '0');
  tmpmsb := '1';
  for n in 1 to offset loop
   tmpQ := (tmpQ(TAPS -1 downto 1) & lsb(TAPS, tmpQ) );
   tmpmsb := tmpQ(TAPS);
  end loop;
  if (nReset = '0') then
   iQ <= tmpQ;
   msb <= tmpmsb;
  elsif (clk'event and clk = '1') then
   if (rst = '1') then
    iQ <= tmpQ;
    msb <= tmpmsb;
   elsif (ena = '1') then
    iQ <= (iQ(TAPS -1 downto 1) & lsb(TAPS, iq) );
    msb <= iQ(TAPS);
   end if;
  end if;
end process gen_regs;
-- assign outputs
Q <= iQ;
Qprev <= (msb & iQ(TAPS downto 2));
end architecture dataflow;



library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity atahost_fifo is
generic(
  DEPTH : natural := 31;                      -- fifo depth, this must be a number according to the following range
                                                 -- 3, 7, 15, 31, 63 ... 65535
  SIZE : natural := 32                        -- data width
);
port(
  clk : in std_logic;                         -- master clock in
  nReset : in std_logic := '1';               -- asynchronous active low reset
  rst : in std_logic := '0';                  -- synchronous active high reset
  rreq : in std_logic;                        -- read request
  wreq : in std_logic;                        -- write request
  empty : out std_logic;                      -- fifo empty
  full : out std_logic;                       -- fifo full
  D : in std_logic_vector(SIZE -1 downto 0);  -- data input
  Q : out std_logic_vector(SIZE -1 downto 0)  -- data output
);
end entity atahost_fifo;
architecture structural of atahost_fifo is
--
-- function declarations
--
function bitsize(n : in natural) return natural is
  variable tmp : unsigned(32 downto 1);
  variable cnt : integer;
begin
  tmp := conv_unsigned(n, 32);
  cnt := 32;
  while ( (tmp(cnt) = '0') and (cnt > 0) ) loop
   cnt := cnt -1;
  end loop;
  return natural(cnt);
end function bitsize;
--
-- component declarations
--
component atahost_lfsr is
generic(
  TAPS : positive range 16 downto 3 :=8;
  OFFSET : natural := 0
);
port(
  clk : in std_logic;                 -- clock input
  ena : in std_logic;                 -- count enable
  nReset : in std_logic;              -- asynchronous active low reset
  rst : in std_logic;                 -- synchronous active high reset
  
  Q : out unsigned(TAPS downto 1);    -- count value
  Qprev : out unsigned(TAPS downto 1) -- previous count value
);
end component atahost_lfsr;
constant ADEPTH : natural := bitsize(DEPTH);
-- memory block
type memory is array (DEPTH -1 downto 0) of std_logic_vector(SIZE -1 downto 0);
-- shared variable mem : memory; -- VHDL'93 PREFERED
signal mem : memory; -- VHDL'87
-- address pointers
signal wr_ptr, rd_ptr, dwr_ptr, drd_ptr : unsigned(ADEPTH -1 downto 0);
begin
-- generate write address; hookup write_pointer counter
wr_ptr_lfsr: atahost_lfsr
  generic map(
   TAPS => ADEPTH,
   OFFSET => 0
  )
  port map(
   clk => clk,
   ena => wreq,
   nReset => nReset,
   rst => rst,
   Q => wr_ptr,
   Qprev => dwr_ptr
  );
-- generate read address; hookup read_pointer counter
rd_ptr_lfsr: atahost_lfsr
  generic map(
   TAPS => ADEPTH,
   OFFSET => 0
  )
  port map(
   clk => clk,
   ena => rreq,
   nReset => nReset,
   rst => rst,
   Q => rd_ptr,
   Qprev => drd_ptr
  );
-- generate full/empty signal
full  <= '1' when (wr_ptr = drd_ptr) else '0';
empty <= '1' when (rd_ptr = wr_ptr) else '0';

-- generate memory structure
gen_mem: process(clk)
begin
  if (clk'event and clk = '1') then
   if (wreq = '1') then
    mem(conv_integer(wr_ptr)) <= D;
   end if;
  end if;
end process gen_mem;
Q <= mem(conv_integer(rd_ptr));
end architecture structural;

[ 本帖最后由 pengyouxiaohui 于 2008-5-5 12:09 编辑 ]

TOP

哎。。我也不会

TOP

只会用verilog

TOP

发新话题