EmbDev.net

Forum: FPGA, VHDL & Verilog Pointer std_logic_vector


von Kim (Guest)


Rate this post
useful
not useful
Hi

I am stuck with a problem in vhdl and hope someone can help me solving 
this.

I am trying to implement a driver on a Atlys Spartan-6 board to read out 
data which comes in via HDMI. I allready located the variable 
(std_logic_vector(23 downto 0)) which carries the signal i want to 
export from the Atlys driver.
The new driver has as input a variable (unsigned(7 downto 0)) in which 
only the adress of my datastream is inserted.
My problem now is to set a pointer between those two variables. I 
believe I somehow have to define my vector as access type, but however i 
am trying to do this, it won't work.

I hope someone can give me a hint how to solve this.

von db8fs (Guest)


Rate this post
useful
not useful
Hi,

Adressing some physical connections in your FPGA won't work, so I guess 
your Is-Access-approach won't work as expected.

So what do you want to achieve? Do you want to extract a value from your 
24-Bit input signal (e.g. input(15 downto 8) ) and assign this 8 to some 
other module?

What I'm talking about:
1
entity test is
2
  Port ( clk : in  STD_LOGIC;
3
           reset : in  STD_LOGIC;
4
           input : in  STD_LOGIC_VECTOR (24 downto 0);
5
           output : out STD_LOGIC_VECTOR( 7 downto 0) );
6
end test;
7
8
architecture Behavioral of test is
9
begin
10
11
  PROCESS (clk)
12
  BEGIN
13
    if RISING_EDGE( clk ) then
14
        output <= input(15 downto 8);
15
    end if;
16
  END PROCESS;
17
18
end Behavioral;


Is this approximately what you're trying to do? Note that I didn't care 
about type conversions like:
1
foobar <= std_logic_vector(  resize( output(7 downto 0), output'length) );

Sorry, if I can't help you further, my HDL has gotten a bit rusty in the 
last 5 years...

von Kim (Guest)


Rate this post
useful
not useful
Thank you for your help so far, but in this case you are describing only 
a quarter of the information is beeing sent.

Here is a little part of the drivers code:

library work;
use work.dds_pack.all;
use work.convert_pack.all;

  entity ws2812_LED_chain_driver is
    generic (
      SYS_CLK_RATE : real := 50000000.0; -- underlying clock rate
      ADR_BITS     : natural := 8; -- Must equal or exceed 
BIT_WIDTH(N_LEDS)+2.
      N_LEDS       : natural := 8  -- Number of LEDs in chain
    );
    port (

      -- System Clock, Reset and Clock Enable
      sys_rst_n  : in  std_logic;
      sys_clk    : in  std_logic;
      sys_clk_en : in  std_logic;

      -- Selection of color information
      c_adr_o    : out unsigned(ADR_BITS-1 downto 0);
      c_dat_i    : in  unsigned(7 downto 0);

      -- Output
      sdat_o     : out std_logic
    );
    end ws2812_LED_chain_driver;


As you can see the color information is a vector[7 downto 0].
The datastream for the input is a STD_LOGIC_VECTOR (23 downto 0), for 
each color 8 bit are needed.

I am quite a VHDL noobie but i cant believe that there is no way to 
adress this 24-bit Variable directly. I mean otherwise the entire driver 
doesnt work.

von Lattice User (Guest)


Rate this post
useful
not useful
Kim wrote:
>
> I am quite a VHDL noobie but i cant believe that there is no way to
> adress this 24-bit Variable directly. I mean otherwise the entire driver
> doesnt work.

You are thinking in software terms.

VHDL is a hardware description language and not a programming 
language. What you call a "driver" is the description of a hardware 
module which is build inside the FPGA by the synthesiser. The 
STD_LOGIC_VECTOR is just a bunch of connection wires to connect this 
module, and not some memory variable with a address.

von db8fs (Guest)


Rate this post
useful
not useful
Kim wrote:
> Thank you for your help so far, but in this case you are
> describing only
> a quarter of the information is beeing sent.

Well, I hoped to avoid confusion by omitting additional signals - I 
guess that's the task of example code.

> Here is a little part of the drivers code:
>
> library work;
> use work.dds_pack.all;
> use work.convert_pack.all;
>
>   entity ws2812_LED_chain_driver is
>     generic (
>       SYS_CLK_RATE : real := 50000000.0; -- underlying clock rate
>       ADR_BITS     : natural := 8; -- Must equal or exceed
> BIT_WIDTH(N_LEDS)+2.
>       N_LEDS       : natural := 8  -- Number of LEDs in chain
>     );
>     port (
>
>       -- System Clock, Reset and Clock Enable
>       sys_rst_n  : in  std_logic;
>       sys_clk    : in  std_logic;
>       sys_clk_en : in  std_logic;
>
>       -- Selection of color information
>       c_adr_o    : out unsigned(ADR_BITS-1 downto 0);
>       c_dat_i    : in  unsigned(7 downto 0);
>
>       -- Output
>       sdat_o     : out std_logic
>     );
>     end ws2812_LED_chain_driver;
>
> As you can see the color information is a vector[7 downto 0].
> The datastream for the input is a STD_LOGIC_VECTOR (23 downto 0), for
> each color 8 bit are needed.
>
> I am quite a VHDL noobie but i cant believe that there is no way to
> adress this 24-bit Variable directly. I mean otherwise the entire driver
> doesnt work.

As Lattice User already mentioned, your HDL synthesis generates you a 
Logic circuit, in especially a set of logical functions that gets 
connected by some switching logic. A 'Signal' in HDL is a physical wire 
connecting subcircuits. How do you want to address wires? You're working 
on register-transfer-level, no memory-like-addressing is available here 
using VHDL.

If you still can't imagine, how HDL works: Try to build a circuit with 
74*-NAND-ICs in a breadboard - how would you solve your problem there.

You could also use the Schematic Editor to get some understanding about 
the results you're getting from your synthesis.

In order to solve your task, you probably have to describe your own 
address decoding logic that maps the memory address to a value. That 
means you have to write your own indirection logic, if the design you're 
using doesn't already have such component.

von Lothar M. (Company: Titel) (lkmiller) (Moderator)


Rate this post
useful
not useful
db8fs wrote:
> A 'Signal' in HDL is a physical wire connecting subcircuits.
A signal (or even a variable) in VHDL may be a register also: just 
involve a clock to get a register. And it may be a latch, mostly a 
undesired one...

von db8fs (Guest)


Rate this post
useful
not useful
Lothar Miller wrote:
> db8fs wrote:
>> A 'Signal' in HDL is a physical wire connecting subcircuits.
> A signal (or even a variable) in VHDL may be a register also: just
> involve a clock to get a register. And it may be a latch, mostly a
> undesired one...

You're absolutely right, of course the synthesizer has to resolve 
time-dependencies and will create sequential logic for it. My intention 
was to point out the different layers of computer architecture and the 
differences in designing for the algorithmical level and for 
sub-algorithmical levels like the Register-Transfer-Level.

Unfortunately the hardware design gets confused by things like SystemC 
or other HighLevel-Synthesis-Tools. They promise to be easy and usable 
like ordinary programming languages, but they still need to be used with 
the mind or the view of a hardware designer placing logic circuits. And 
even VHDL/Verilog gives the user a lot of possibilities with the risk 
for the beginner of creating non-sythesizable descriptions.

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.