我想实现对主时钟10M进行分频,分出8个不同频率作为ADC启动时钟,再加一个控制可以停止ADC。
器件:ALTERA EPM3128ATC100
编译器:QUARTUS II 5.1
输入信号:
CLKIN 10M主时钟
SystemResetn 系统复位信号
输出信号:
CONVST_n
定义的内部变量:
SIGNAL count_signal : INTEGER RANGE 0 TO 300;
SIGNAL Counts : INTEGER RANGE 0 TO 300;
SIGNAL mid1 : STD_LOGIC ;
SIGNAL AdcConvertClk : std_logic;
之前已计算好的地址:
CpldRegCs31 - 停止分频输出
CpldRegCs_0 ~ CpldRegCs_7输出不同的8个频率。
-- =======================================================================
--XXXX,12bit ADC
-- 启动信号#CONVST由CPLD时钟分频得到,需要的采样频率为2M(0.5uS 5分频)、
-- 1M(1us 10分频)、500K(2us 20分频)、333K(3us 30分频)、250K(4us 40分频)、
-- 200K(5us 50分频)、100K(10us 100分频)、50K(20us 200分频)。
--
process( SystemResetn, DSP_WEn, CpldRegCs31, CpldRegCs_0, CpldRegCs_1, CpldRegCs_2, CpldRegCs_3,
CpldRegCs_4, CpldRegCs_5, CpldRegCs_6, CpldRegCs_7)
begin
if SystemResetn = '0' then
Counts <= 300;
elsif DSP_WEn'event and DSP_WEn = '1' then -- 写选通上升沿来临时
if( CpldRegCs31 = '1' ) then -- 关闭启动时钟
Counts <= 300;
elsif( CpldRegCs_0 = '1' ) then -- 0.5us未完成,5分频
Counts <= 2;
elsif( CpldRegCs_1 = '1' ) then -- 1us
Counts <= 4;
elsif( CpldRegCs_2 = '1' ) then -- 2us
Counts <= 9;
elsif( CpldRegCs_3 = '1' ) then -- 3us未完成,30分频
Counts <= 29;
elsif( CpldRegCs_4 = '1' ) then -- 4us
Counts <= 19;
elsif( CpldRegCs_5 = '1' ) then -- 5us
Counts <= 24;
elsif( CpldRegCs_6 = '1' ) then -- 10us
Counts <= 49;
elsif( CpldRegCs_7 = '1' ) then -- 20us
Counts <= 99;
end if;
end if;
end process;
process( SystemResetn, CLKIN, mid1, Counts)
begin
if SystemResetn = '0' then
AdcConvertClk <= '0'; -- 0还是1,不确定
elsif CLKIN'event and CLKIN = '1' then
if count_signal = Counts and Counts /= 300 then
count_signal <= 0;
mid1 <= not mid1;
else
count_signal <= count_signal + 1;
end if;
end if;
AdcConvertClk <= mid1;
end process;
CONVST_n <= AdcConvertClk;
目前出现下列编译警告:
Warning: Reduced register "Counts[7]" with stuck data_in port to stuck value GND
尽管不影响使用(分频结果是对的),但不明白报警的原因,不知道任何解决,请大侠帮忙,谢谢! |