VHDL ile Değişinti (Variance) Hesaplama

Verilen bir dizinin değişintisinin (varyansının) hesaplanması Denkelm (1)’de gösterilmiştir. Denklem (1)’de X diziyi, µ dizinin ortalama değerini, N dizi boyunu ve σ2 değişinti değerini göstermektedir. Denklem (1)’de verilen denklemlerde öncelikle dizinin ortalama değerinin hesaplanması gerekmektedir.

denk1

Denklem (2)’de varyans hesaplama için kullanılabilecek farklı bir hesaplama yöntemi gösterilmiştir. Denklem 2’de dizi içerisinde bulunan sayıların karelerinin toplamının ortalamasından, dizinin ortalama değerinin karesi çıkartılarak varyans değeri hesaplanmaktadır.

denk2

Aşağıda verilen şekilde 1’den 20’ye kadar olan sayıların 10’luk bir diziye sırasıyla yazılması ile elde edilen değişinti sonuçlarının hesaplanmasına ilişkin benzetim sonucu gösterilmiştir. Benzetim sonucu verileri sayfanın sonunda verilen MATLAB kodu ile doğrulanmıştır.

Değişinti hesaplama işlemlerini gerçekleştirilen variance.vhd VHDL kodu kullanulmıştır. Kod içerisinde tanımlı moving_sum alt devresi blog mevctut olan VHDL ile Kayan Toplayıcı (Moving Sum) Tasarımı yazısında bulabilirsiniz.

tb_vairance

Aşağıda benzetim yapılabilemsini sağlayan sınama kodu verilmiştir.

  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.STD_LOGIC_SIGNED.ALL;
  4. use IEEE.STD_LOGIC_ARITH.ALL;
  5.  
  6. entity tb_variance is
  7. end tb_variance;
  8.  
  9. architecture Behavioral of tb_variance is
  10. component variance
  11. Generic(
  12. DATA_WIDTH : integer := 12;
  13. SUM_SIZE : integer := 10
  14. );
  15. Port (
  16. in_clk : in std_logic;
  17. in_rst : in std_logic;
  18. in_data : in std_logic_vector(DATA_WIDTH - 1 downto 0);
  19. in_data_vld : in std_logic;
  20. out_data : out std_logic_vector(2 * DATA_WIDTH - 1 downto 0);
  21. out_data_vld : out std_logic
  22. );
  23. end component;
  24.  
  25. constant DATA_WIDTH : integer := 12;
  26. constant SUM_SIZE : integer := 10;
  27. constant CLK_PERIOD : time := 1 us;
  28.  
  29. signal in_clk : std_logic;
  30. signal in_data : std_logic_vector(DATA_WIDTH - 1 downto 0) := (others => '0');
  31. signal in_data_vld : std_logic;
  32. signal r_variance : std_logic_vector(2 * DATA_WIDTH - 1 downto 0) := (others => '0');
  33.  
  34.  
  35. begin
  36.  
  37.  
  38. process
  39. begin
  40. in_clk <= '1';
  41. wait for CLK_PERIOD / 2;
  42. in_clk <= '0';
  43. wait for CLK_PERIOD / 2;
  44. end process;
  45.  
  46. process
  47. begin
  48. in_data_vld <= '0';
  49. wait for 9 * CLK_PERIOD;
  50. if in_data = 20 then
  51. in_data <= conv_std_logic_vector(1, DATA_WIDTH);
  52. else
  53. in_data <= in_data + 1;
  54. end if;
  55. in_data_vld <= '1';
  56. wait for CLK_PERIOD;
  57. end process;
  58.  
  59. variance_map : variance
  60. Generic map(
  61. DATA_WIDTH => DATA_WIDTH,
  62. SUM_SIZE => SUM_SIZE
  63. )
  64. Port map(
  65. in_clk => in_clk,
  66. in_rst => '0',
  67. in_data => in_data,
  68. in_data_vld => in_data_vld,
  69. out_data => r_variance,
  70. out_data_vld => open
  71. );
  72.  
  73. end Behavioral;

 

  1. var quads_screen_width = document.body.clientWidth;
  2. if ( quads_screen_width >= 1140 ) {
  3. /* desktop monitors */
  4. document.write('');
  5. (adsbygoogle = window.adsbygoogle || []).push({});
  6. }if ( quads_screen_width >= 1024 && quads_screen_width < 1140 ) {
  7. /* tablet landscape */
  8. document.write('');
  9. (adsbygoogle = window.adsbygoogle || []).push({});
  10. }if ( quads_screen_width >= 768 && quads_screen_width < 1024 ) {
  11. /* tablet portrait */
  12. document.write('');
  13. (adsbygoogle = window.adsbygoogle || []).push({});
  14. }if ( quads_screen_width < 768 ) {
  15. /* phone */
  16. document.write('');
  17. (adsbygoogle = window.adsbygoogle || []).push({});
  18. }
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25. library IEEE;
  26. use IEEE.STD_LOGIC_1164.ALL;
  27. use IEEE.STD_LOGIC_SIGNED.ALL;
  28. use IEEE.STD_LOGIC_ARITH.ALL;
  29.  
  30. entity variance is
  31. Generic(
  32. DATA_WIDTH : integer := 12;
  33. SUM_SIZE : integer := 10
  34. );
  35. Port (
  36. in_clk : in std_logic;
  37. in_rst : in std_logic;
  38. in_data : in std_logic_vector(DATA_WIDTH - 1 downto 0);
  39. in_data_vld : in std_logic;
  40. out_data : out std_logic_vector(2 * DATA_WIDTH - 1 downto 0);
  41. out_data_vld : out std_logic
  42. );
  43. end variance;
  44.  
  45. architecture Behavioral of variance is
  46.  
  47. component moving_sum
  48. Generic(
  49. DATA_WIDTH : integer := 12;
  50. SUM_SIZE : integer := 10
  51. );
  52. Port (
  53. in_clk : in std_logic;
  54. in_rst : in std_logic;
  55. in_data : in std_logic_vector(DATA_WIDTH - 1 downto 0);
  56. in_data_vld : in std_logic;
  57. out_sum_value : out std_logic_vector(DATA_WIDTH - 1 downto 0);
  58. out_sum_value_vld : out std_logic
  59. );
  60. end component;
  61.  
  62. component integer_divider
  63. Generic(
  64. DATA_WIDTH : integer := 12;
  65. DIV_PARAM : integer := 10
  66. );
  67. Port (
  68. in_clk : in std_logic;
  69. in_rst : in std_logic;
  70. in_data : in std_logic_vector(DATA_WIDTH - 1 downto 0);
  71. in_data_vld : in std_logic;
  72. out_data : out std_logic_vector(DATA_WIDTH - 1 downto 0);
  73. out_data_vld : out std_logic
  74. );
  75. end component;
  76.  
  77. component integer_multiplier
  78. Generic(
  79. DATA_WIDTH : integer := 12
  80. );
  81. Port (
  82. in_clk : in std_logic;
  83. in_rst : in std_logic;
  84. in_data : in std_logic_vector(DATA_WIDTH - 1 downto 0);
  85. in_data_vld : in std_logic;
  86. out_data : out std_logic_vector(2 * DATA_WIDTH - 1 downto 0);
  87. out_data_vld : out std_logic
  88. );
  89. end component;
  90.  
  91. signal r_data : std_logic_vector(2 * DATA_WIDTH - 1 downto 0);
  92. signal r_data_vld : std_logic;
  93. --
  94. signal r_ex : std_logic_vector(DATA_WIDTH - 1 downto 0);
  95. signal r_ex_vld : std_logic;
  96. signal r_ex_mean : std_logic_vector(DATA_WIDTH - 1 downto 0);
  97. signal r_ex_mean_vld : std_logic;
  98. signal r_ex2 : std_logic_vector(2 * DATA_WIDTH - 1 downto 0);
  99. signal r_ex2_vld : std_logic;
  100. --
  101. signal r_e2x : std_logic_vector(2 * DATA_WIDTH - 1 downto 0);
  102. signal r_e2x_vld : std_logic;
  103. signal r_e2x_mean : std_logic_vector(2 * DATA_WIDTH - 1 downto 0);
  104. signal r_e2x_mean_vld : std_logic;
  105. signal r_e2x_mean_dly : std_logic_vector(2 * DATA_WIDTH - 1 downto 0);
  106. signal r_e2x_mean_dly_vld : std_logic;
  107.  
  108. begin
  109.  
  110. out_data <= r_data;
  111. out_data_vld <= r_data_vld;
  112.  
  113. process(in_clk, in_rst)
  114. begin
  115. if in_rst = '1' then
  116. r_data <= (others => '0');
  117. r_data_vld <= '0';
  118. elsif rising_edge(in_clk) then
  119. r_data_vld <= '0';
  120. if r_ex2_vld = '1' then
  121. r_data <= r_e2x_mean_dly - r_ex2;
  122. r_data_vld <= '1';
  123. end if;
  124. end if;
  125. end process;
  126.  
  127. ---
  128. ex_sum_map : moving_sum
  129. Generic map(
  130. DATA_WIDTH => DATA_WIDTH,
  131. SUM_SIZE => SUM_SIZE
  132. )
  133. Port map (
  134. in_clk => in_clk,
  135. in_rst => in_rst,
  136. in_data => in_data,
  137. in_data_vld => in_data_vld,
  138. out_sum_value => r_ex,
  139. out_sum_value_vld => r_ex_vld
  140. );
  141.  
  142. ex_divider_map : integer_divider
  143. Generic map(
  144. DATA_WIDTH => DATA_WIDTH,
  145. DIV_PARAM => SUM_SIZE
  146. )
  147. Port map (
  148. in_clk => in_clk,
  149. in_rst => in_rst,
  150. in_data => r_ex,
  151. in_data_vld => r_ex_vld,
  152. out_data => r_ex_mean,
  153. out_data_vld => r_ex_mean_vld
  154. );
  155.  
  156. ex_multiplier_map : integer_multiplier
  157. Generic map(
  158. DATA_WIDTH => DATA_WIDTH
  159. )
  160. Port map(
  161. in_clk => in_clk,
  162. in_rst => in_rst,
  163. in_data => r_ex_mean,
  164. in_data_vld => r_ex_mean_vld,
  165. out_data => r_ex2,
  166. out_data_vld => r_ex2_vld
  167. );
  168.  
  169. ----------------------
  170. e2x_sum_map : moving_sum
  171. Generic map(
  172. DATA_WIDTH => 2* DATA_WIDTH,
  173. SUM_SIZE => SUM_SIZE
  174. )
  175. Port map (
  176. in_clk => in_clk,
  177. in_rst => in_rst,
  178. in_data => in_data * in_data,
  179. in_data_vld => in_data_vld,
  180. out_sum_value => r_e2x,
  181. out_sum_value_vld => r_e2x_vld
  182. );
  183.  
  184. e2x_divider_map : integer_divider
  185. Generic map(
  186. DATA_WIDTH => 2 * DATA_WIDTH,
  187. DIV_PARAM => SUM_SIZE
  188. )
  189. Port map (
  190. in_clk => in_clk,
  191. in_rst => in_rst,
  192. in_data => r_e2x,
  193. in_data_vld => r_e2x_vld,
  194. out_data => r_e2x_mean,
  195. out_data_vld => r_e2x_mean_vld
  196. );
  197.  
  198. process(in_clk, in_rst)
  199. begin
  200. if in_rst = '1' then
  201. r_e2x_mean_dly <= (others => '0');
  202. r_e2x_mean_dly_vld <= '0';
  203. elsif rising_edge(in_clk) then
  204. r_e2x_mean_dly_vld <= '0';
  205. if r_e2x_mean_vld = '1' then
  206. r_e2x_mean_dly <= r_e2x_mean;
  207. r_e2x_mean_dly_vld <= '1';
  208. end if;
  209. end if;
  210. end process;
  211.  
  212. end Behavioral;

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
 
entity integer_divider is
	Generic(
		DATA_WIDTH : integer := 12;
		DIV_PARAM : integer := 10 
	);
	Port ( 
		in_clk : in std_logic;
		in_rst : in std_logic;
		in_data : in std_logic_vector(DATA_WIDTH - 1 downto 0);
		in_data_vld : in std_logic;
		out_data : out std_logic_vector(DATA_WIDTH - 1 downto 0);
		out_data_vld : out std_logic
	);
end integer_divider;
 
architecture Behavioral of integer_divider is
 
	signal r_data : std_logic_vector(DATA_WIDTH - 1 downto 0) := (others => '0');
	signal r_data_vld : std_logic := '0';
 
	function f_Int_Divider (in_data : std_logic_vector(DATA_WIDTH - 1 downto 0); DIV_PARAM : integer ) return std_logic_vector is
	begin
		return conv_std_logic_vector((conv_integer(in_data) / DIV_PARAM), DATA_WIDTH);
	end f_Int_Divider;
 
begin
 
	out_data <= r_data;
	out_data_vld <= r_data_vld;
 
	process(in_clk, in_rst)		
	begin
		if in_rst = '1' then
			r_data <= (others => '0');
			r_data_vld <= '0';
		elsif rising_edge(in_clk) then
			r_data_vld <= '0';
			if in_data_vld = '1' then
				r_data <= f_Int_Divider(in_data, DIV_PARAM);
				r_data_vld <= '1'; 
			end if;
		end if;
	end process;
 
end Behavioral;

 

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_SIGNED.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
 
entity integer_multiplier is
	Generic(
		DATA_WIDTH : integer := 12
	);
	Port ( 
		in_clk : in std_logic;
		in_rst : in std_logic;
		in_data : in std_logic_vector(DATA_WIDTH - 1 downto 0);
		in_data_vld : in std_logic;
		out_data : out std_logic_vector(2 * DATA_WIDTH - 1 downto 0);
		out_data_vld : out std_logic
	);
end integer_multiplier;
 
architecture Behavioral of integer_multiplier is
 
	signal r_data : std_logic_vector(2 * DATA_WIDTH - 1 downto 0) := (others => '0');
	signal r_data_vld : std_logic := '0';
 
begin
 
	out_data <= r_data;
	out_data_vld <= r_data_vld;
 
	process(in_clk, in_rst)		
	begin
		if in_rst = '1' then
			r_data <= (others => '0');
			r_data_vld <= '0';
		elsif rising_edge(in_clk) then
			r_data_vld <= '0';
			if in_data_vld = '1' then
				r_data <= in_data * in_data;
				r_data_vld <= '1'; 
			end if;
		end if;
	end process;
 
 
end Behavioral;

 

Aşağıda sınama kodlarının doğruluk kontrolünün yapıldığı MATLAB kodu verilmiştir.

  1.  
  2. Buffer_length = 10;
  3. Buffer = zeros(1, Buffer_length);
  4.  
  5. for n_j = 0 : 1
  6. for n_i = 1 : 20
  7. Buffer(1 : Buffer_length - 1) = Buffer(2 : Buffer_length);
  8. Buffer(Buffer_length) = n_i;
  9. Var(n_j * 20 + n_i) = fix(sum(Buffer.^2) / Buffer_length) - ...
  10. fix(sum(Buffer) / Buffer_length)^2;
  11. end
  12. end

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir