- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I've started to learn vhdl recently.i write a vhdl code to detemine the arith
statement,but it dosen't work.actually when i simulate it;the output dose not change and it remains 0.0; i don't know where is my mistake.Do I need to use a external clock??i do it but it dose not change :-( please help me library IEEE; use IEEE.STD_LOGIC_1164.ALL; package mypack is type real_vector is array (integer range <>) of real; end mypack; library IEEE; use IEEE.STD_LOGIC_1164.ALL; --use IEEE.STD_LOGIC_UNSIGNED.ALL; use work.mypack.all; entity convolution is port (x:in real_vector(0 to 3); y:in real_vector(0 to 1); f:out real_vector (0 to 4)); end convolution; architecture Behavioral of convolution is --signal temp : real_vector (0 to 4):= (others => 0.0); --signal enable : std_logic :='0'; begin process (x,y) variable sum :real; begin for n in f'range loop enable <= '0'; for k in y'range loop sum:=sum + x(k)*y(n-k); end loop; -- temp(n) <= sum; f(n) <= sum ; sum:=0.0; end loop; enable <= '1'; --if (enable'event and enable='1') then -- f <= temp; --end if; end process; end Behavioral;Link Copied
3 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'm nut even sure how this code can run in a simulator without any errors but you should maybe check your algorithm first. In this linesum:=sum + x(k)*y(n-k);
(n-k) can take a lot of values outside of the range 0 to 1, and that should cause an error in the simulator real quick.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
--- Quote Start --- I'm nut even sure how this code can run in a simulator without any errors but you should maybe check your algorithm first. In this line
sum:=sum + x(k)*y(n-k);
(n-k) can take a lot of values outside of the range 0 to 1, and that should cause an error in the simulator real quick. You do realize that this code isn't synthesizable on real hardware, don't you? --- Quote End --- thank you for your reply actually i want to simulate an upsampler (in DSP); and for implemet this ,i need to implement a convolution function,therfore i used that vhdl code(that is sent) and that is wrong. i don't know how can do it;please help me thank you hello,i changed my vhdl to the following code,but the output remains 0 and dosen't change when the inputs change,where is my mistake?? package mypack is type real_vec is array(integer range <> ) of real; end mypack; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use work.mypack.all; entity conv1 is generic (m:integer :=3; n:integer :=1); port (x:in real_vec(0 to m); y:in real_vec(0 to n); f:out real_vec(0 to m+n)); end conv1; architecture Behavioral of conv1 is signal h : real_vec(-(m+n) to m+n):=(others =>0.0); --signal h : real_vec(-m to n):=(others =>0.0); signal sum:real:=0.0; begin process (x,y) begin h(0 to n) <=y; for i in 0 to m+n loop for k in 0 to m loop sum <= sum + x(k)* h(i-k); end loop; f(i) <= sum; sum <=0.0; end loop; end process; end Behavioral;
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
In this linesum <= sum + x(k)* h(i-k);
as sum is a signal, it will only get its value from the simulator after the process was executed. There is always asmall delay (called delta delay) before a signal gets it's value. Therefore sum will always stay at 0. If you want to make an accumulator that is updated without waiting between each operation, you need to make sum a variable.

Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page