درود
با توجه به اینکه هنگام تعریف integer میتوان رنج آن را پارامتریک تعریف کرد و این خود عرض بیت اون سیگنال رو هم تعیین میکنه، به نظر میاد که راه آسونتریه برای پیاده سازی شمارنده.
من کد زیر را برای تولید کلاک I2C در ویوادو برای تست روی بورد artys7 نوشته م. و در گزارش Utilization بعد از Implementaion هم عرض بیت کانتر رو چک کرده م که با رنج تعیین شده همخوانی داره.
1. با توجه این موضوع، چرا در بیشتر آموزشها و مراجع توصیه میکنند که از integer استفاده نشه؟
2. در صورت عدم استفاده از integer به چه طریق همین کد را با نوع دیگری مثلا unsigned یا std_logic_vector میشه نوشت؟
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity scl_clock_generator is Generic( F_CLK : integer := 100000000; F_SCL : integer := 100000 ); Port ( clk :in std_logic; scl_clk :out std_logic; data_clk :out std_logic ); end scl_clock_generator; architecture Behavioral of scl_clock_generator is signal counter :integer range 0 to F_CLK/F_SCL-1 := 0; signal sScl_clk, sData_clk :std_logic := '0'; begin scl_clk <= sScl_clk; data_clk <= sData_clk; process (clk) begin if clk'event and clk='1' then counter <= counter+1; if(counter = F_CLK/F_SCL-1) then counter <= 0; end if; case counter is when 0 to F_CLK/F_SCL/4-1 => sScl_clk <= '0'; sData_clk <= '0'; when F_CLK/F_SCL/4 to F_CLK/F_SCL/4*2-1 => sScl_clk <= '0'; sData_clk <= '1'; when F_CLK/F_SCL/4*2 to F_CLK/F_SCL/4*3-1 => sScl_clk <= '1'; sData_clk <= '1'; when F_CLK/F_SCL/4*3 to F_CLK/F_SCL-1 => sScl_clk <= '1'; sData_clk <= '0'; end case; end if; -- rising edge of Clock end process; end Behavioral;
سلام،
استفاده نکردن از نوع integer برای پیادهسازی، توصیه شرکت زایلینکس است و دلیل آن هم ایجاد ابهام برای نرمافزار هنگام استفاده از این نوع است. در دورههایی که شرکت کردید بارها از نوع unsigned برای تولید شمارنده و ایجاد تایمینگهای مختلف از جمله I2C استفاده شده است.
موفق باشید.