- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须使用 VHDL 语言(因此比率为 200/156)从 100MHz 基本时钟(占空比 0.5)生成 78MHz 时钟(占空比 0.5 或 0.7)。
我知道我可以使用 DCM、PLL 或类似的工具,但目前(不幸的是)我不能。
因此我想使用(不包括任何 DCM 或 PLL)一个简单的分频器,但在这种情况下,我也知道频率只能除以整数(并且最小为 2,因为我会使用计数器来做到这一点 - 并且在在我的情况下,我必须将基本时钟除以 1,2820512820512820512820512820513 ...)。
所以我不知道如何在不使用任何 DCM 或其他东西的情况下实现这一点......我想将 100MHz 时钟划分为更小的频率(如 50MHz、25MHz 等)并添加它们(例如 50+25+3),但这是正确的方式吗(逻辑上我不这么认为)?
最佳答案
这是一个通用的分数 M/D 时钟分频器设计,应该可以解决您的问题。几年前我写了这个供我自己使用。根据您的目标设备,您可能希望使用 std_logic 而不是 bit。
基本思想是使用累加器跟踪小数时钟相位。这与实现直接数字合成器 (DDS) 的方式非常相似,但只需要担心时钟。
享受! =)
如果不清楚如何使用它,您将使用 39 的乘数和 50 的除数的参数,如 100 * 39/100 = 78
,因此所需的操作数宽度为 6(因为 2**6 = 64
)。请注意,因为这是输入时钟速率的一半以上,所以没有同步逻辑可以生成输出时钟信号,因此该模块在该速率下的唯一有效输出将是时钟使能。
另请注意,任何可能的除数值的最坏情况是任何一个周期的 33%/66% 占空比。您对乘数和除数的特定选择可能会更好(我需要做一些数学来判断),但是对于使用有理除法的任何算法,通常情况下,您无法得到比最坏情况更好的选择。您可以使用真正的硬件 PLL 或 DLL 清理此模块的输出,以过滤相位噪声并将占空比纳入您的目标范围。
-- Copyright © 2010 Wesley J. Landaker <wjl@icecavern.net>
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
library ieee;
use ieee.numeric_bit.all;
-- Clock Divider
-- =============
--
-- Fractionally divides the input clock using simultaneous frequency
-- multiplication and division.
--
-- Outputs both a clock enable and a balanced duty-cycle clock. The clock's
-- duty-cycle is as always close to 50% as possible, worst case is 33%/66%.
--
-- Details
-- =======
--
-- Given:
--
-- Fi = input frequency Hz
-- M = multiplier
-- D = divisor
-- Fo = output frequency Hz
--
-- Where:
--
-- M ≤ D
--
-- Then:
--
-- ⎧ M
-- ⎪ Fi·— if M <= D
-- Fo = ⎨ D
-- ⎪
-- ⎩ undefined if M > D
--
--
-- If (M/D) is greater than 0.5, only the clock enable is valid.
-- If (M/D) is greater than 1.0, both outputs are invalid.
entity Clock_Divider is
generic (
operand_width : positive
);
port (
clock : in bit;
reset : in bit;
multiplier : in unsigned(operand_width-1 downto 0);
divisor : in unsigned(operand_width-1 downto 0);
out_enable : buffer bit;
out_clock : buffer bit
);
end entity;
architecture any of Clock_Divider is
signal enable_2x : bit;
begin
-- Divide the clock by accumulating phase using the mulitplier and
-- subtracting when we pass the divisor value.
proc_enable : process is
variable phase : unsigned(operand_width downto 0);
begin
wait until rising_edge(clock);
phase := phase + multiplier;
if phase >= divisor then
phase := phase - divisor;
out_enable <= '1';
else
out_enable <= '0';
end if;
if reset = '1' then
phase := (others => '0');
out_enable <= '0';
end if;
end process;
proc_enable : process is
variable phase : unsigned(operand_width downto 0);
begin
wait until rising_edge(clock);
phase := phase + (multiplier & '0');
if phase >= divisor then
phase := phase - divisor;
enable_2x <= '1';
else
enable_2x <= '0';
end if;
if reset = '1' then
phase := (others => '0');
enable_2x <= '0';
end if;
end process;
proc_out_clock : process is
begin
wait until rising_edge(clock);
if enable_2x = '1' then
out_clock <= not out_clock;
end if;
end process;
end architecture;
关于vhdl - 从 100MHz 基本时钟生成 78MHz 时钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13324445/
是否可以通过Java编程方式知道CPU的最大速度(MHZ)? 在谷歌上进行了大量搜索后,我没有找到获取它的方法。 我找到了一种在 Android 中有效的方法,但我不是为 Android 开发这个方法
所以我刚刚注意到我的中文 Arduino Uno 有一个 12 MHz 的晶体而不是原来的 16Mhz。 我进行了计算,结果发现相差了四分之一毫秒。 我的问题: 这会影响伺服系统或音调 () 或任何其
我想创建一个应用程序,以 MHz 为单位监控并向用户显示系统处理器中每个内核的频率。我见过其他应用程序这样做,例如 Piriform's Speccy , 所以我知道这一定是可能的。 我曾尝试在 St
我正在为 FRDM-KL46Z 平台开发 IAR 编译器。我想使用内部时钟并将其设置为 48 MHz(或尽可能最大值)。到目前为止,我已经在提供的示例 sysinit.c 文件和函数 sysinit(
如何获得 Android 设备的处理器速度(以 MHz 为单位)?我能够根据 BogoMips 获得速度通过读取 \proc\cpuinfo 文件。如何将 BogoMips 转换为 MHz,或者是否有
我正在准备一个单位测验,有两种转换让我很难过。 类型一: XXX 计算机上一个周期的长度(以 ns 为单位)是多少? - 在这种情况下,XXX 可以是一些 MHz 或 Ghz,随机。我在转换 cyle
编辑:PIC 16F684 好的,我有一个简单的 3 LED 二进制时钟,从 0 到 7 计数,并且希望在每个灯打开之间添加大约 1 秒的延迟。 我发现每个灯都需要处于某种循环中,并且我必须使用计数来
我想制作一个 android 应用程序,它将接收从 RF 链路发射器(https://www.sparkfun.com/products/10535?)传输的基本数据。我想首先知道是否有可能以某种方式
我有这个脚本来获取 RPi 的当前 CPU 速度 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq | awk '{if($NF+0>
今天我得到了一些很酷的 radio 接收器和发射器,问题是当我输入我想发送的消息时,它会在另一个 arduino 上吐出乱码。 //transmitter #include void setup()
首先,我是 Arduino 的初学者。我有一个电路,包括:一个 Arduino Uno、一个 RFID RC522 读卡器和一个 RF 433 MHz 模块的发送器。 我正在尝试使用 RF 433MH
我在各种操作系统上运行一些计时代码。我注意到 QueryPerformanceCounter 的结果有以下模式 标准 Windows XP 使用处理器频率,这意味着它在后台使用 RDTSC。 Vist
开始之前:是的,我知道答案是 architecture dependent - 我只对大致数字感兴趣,就数量级而言。 linux内核对中断频率有上限吗? 背景:我想在 Linux 中连接相机模块。该模
我有一个评估套件,它具有 ARM Cortex-A8 内核的实现。处理器数据表指出它具有 ARM Cortex A8™ core, which operates at speeds as high a
最近新买了一个USB示波器,想测avr timer0的频率。有一个 12 MHz 晶体振荡器连接到 atmega,timer0 设置为没有预分频器的快速 PWM 模式。这是代码: #include
我正在使用 Jupyter Notebook 和 Tensorflow GPU 后端运行 Keras。我使用各种虚拟模型进行了一些测试,同时使用 MSI Afterburner、GPU-Z、nvidi
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
目前,我已经为我的一个嵌入式板(Galileo Gen 2)制作了一个嵌入式 GUI 应用程序。该应用程序可以执行 I²C、SPI、GPIO、ADC、UART 和 PWM 的测试事件,包括它们的 Pi
我正在使用 Arduino Mega 2560 进行一个项目,LCD Keypad Shield ,以及 RFID 13.56 MHz MF522 模块。 问题是 LCD 键盘屏蔽和 RFID MF5
我是一名优秀的程序员,十分优秀!