首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >VHDL1节拍时钟延迟信号和2节拍的另一个信号

VHDL1节拍时钟延迟信号和2节拍的另一个信号
EN

Stack Overflow用户
提问于 2020-05-31 11:59:39
回答 2查看 232关注 0票数 0

谁能解释一下为什么我的计数有一个刻度的延迟,而我的总和有两个刻度的延迟?我是一个初学者,所以这对一些人来说可能是微不足道的,但我真的不明白问题所在。这模拟了单个类型的硬币存储实体在自动食品分配器的情况下应该如何表现。最初,我认为与计数相比,总和的1个节拍延迟可能是由于2个不同的时钟进程中的2个信号,但似乎不是这样。考虑到这里需要一个顺序代码,我不知道如何至少为每个信号减少1个滴答的总延迟。如果两者都没有延迟,那将是最理想的。感谢您查看此问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 library IEEE;
 use IEEE.std_logic_1164.all;
 use IEEE.numeric_std.all;
 use work.fixed_point_pkg.all;

 entity single_coin_type_storage is
 generic(INIT_COUNT : natural;
    --Number of coins loaded at maintenance.
    INIT_SUM   : unsigned(15 downto 0);
    --Value of the coins loaded at maintenance.
    COIN_VAL   : unsigned(15 downto 0));
    --Value of a single coin.
 port(clk     : in std_logic;
    --System clock.
    reset    : in std_logic;
    --System reset.
    en       : in std_logic;
    --Enable input. When low, no register updates can
    --happen and the output of >>count<< should be zero.
    add_coin : in std_logic;
    --Signals that a coin is being added.
    rem_coin : in std_logic;
    --Signals that a coin is being removed.
    count    : out std_logic_vector(4 downto 0);
    --Number of coins currently stored. If >>en<< is low,
    --must be zero.
    sum      : out std_logic_vector(15 downto 0);
    --Value of all coins currently stored. Should be
    --output at all times, regardless of >>en<<.
    fault    : out std_logic);
    --Signals that an attempt to insert a coin into a full
    --storage unit or to remove it from an empty unit is 
    --being made.
end entity single_coin_type_storage;

architecture rtl of single_coin_type_storage is

signal counter_reg: unsigned(5 downto 0);
signal en_vec: std_logic_vector(4 downto 0);
signal sum_reg: unsigned(15 downto 0);

signal y_count : unsigned(5 downto 0);
signal y_sum   : unsigned(15 downto 0);

signal ovf ,internal_en: std_logic;
begin
y_count <=  counter_reg +1 when (add_coin ='1') else
        counter_reg - 1 when (rem_coin ='1') else 
        counter_reg ;

ovf <= y_count(5);

internal_en <= en and (not ovf);
en_vec <= (others=>en);

y_sum <= sum_reg + COIN_VAL when (add_coin ='1') else
     sum_reg - COIN_VAL when (rem_coin ='1') else y_sum ;



CNT_REG_P: process (clk)
begin
if (clk'event and clk ='1') then
    if (reset ='1') then 
        counter_reg <= to_unsigned(INIT_COUNT,counter_reg'length);
    elsif (en ='1') then
        counter_reg <= y_count;
    end if;
end if;
end process;



SUM_REG_P: process (clk)
begin
if (clk'event and clk ='1') then
    if (reset ='1') then 
        sum_reg <= INIT_SUM;
    elsif (en ='1') then
        sum_reg <= y_sum;
    end if;
end if;
end process;


count <= en_vec and std_logic_vector(counter_reg(4 downto 0));
fault <= ovf and en;
sum<= std_logic_vector(sum_reg);

end architecture rtl;


library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.math_real.all;

package fixed_point_pkg is
--There are up to 31 coins of each type, which gives the maximum value
--of 31 * 8.7 = 269.7. Hence we need 9 bits for the whole part. The
--smallest fraction we need to represent is 1/5, which is decently
--approximated by 1/8 + 1/16 + 1/128 (31 * error < 0.2). Hence, we
--need 7 more bits for the fractional part.
--The representation is thus 9:7.
constant fifth       : unsigned(15 downto 0) := x"0019";
--0000 0000 0.001 1001
constant half        : unsigned(15 downto 0) := x"0040";
--0000 0000 0.100 0000
constant one         : unsigned(15 downto 0) := x"0080";
--0000 0000 1.000 0000
constant two         : unsigned(15 downto 0) := x"0100";
--0000 0001 0.000 0000
constant five        : unsigned(15 downto 0) := x"0280";
--0000 0010 1.000 0000
function fixed_to_float(fixed : std_logic_vector) return real;
--Converts a 9.7 16-bit fixed point number to a real.
function float_to_fixed(float : real) return unsigned;
--Converts a real to a 9.7 16-bit fixed point number.
function float_eq(a : real; b : real) return boolean;
--Compares two floats by truncating them to two decimal points. 

type init_count_t is array(0 to 4) of natural;
--Represents the numbers of coins of each type loaded at maintenance.
--The first element corresponds to the 20 cents coins and the last to 5 franc ones.
type init_sum_t   is array(0 to 4) of unsigned(15 downto 0);
--Represents the total values of the coins of each type loaded at maintentance.
--The order is the same as for >>init_count_t<<.
constant main_init_counts : init_count_t := (20, 10, 10, 5, 0);
constant main_init_sums   : init_sum_t := (x"0200", x"0280", x"0500", x"0500", x"0000");
end package fixed_point_pkg;

package body fixed_point_pkg is
function fixed_to_float(fixed : std_logic_vector) return real is
    type val_t is array(15 downto 0) of real;
    constant vals : val_t := (256.0, 128.0, 64.0, 32.0, 16.0, 8.0, 4.0, 2.0, 1.0,
                              0.5, 0.25, 0.125, 0.0625, 0.03125, 0.015625, 0.0078125);
    variable sum  : real := 0.0;
begin
    for i in 0 to 15 loop
        if fixed(i) = '1' then
            sum := sum + vals(i);
        end if;
    end loop;
    return sum;
end function fixed_to_float;

function float_to_fixed(float : real) return unsigned is
begin
    return to_unsigned(integer(trunc(float * 128.0)), 16);
end function float_to_fixed;

function float_eq(a : real; b : real) return boolean is
    variable a_int, b_int : integer;
begin
    a_int := integer(trunc(a * 100.0));
    b_int := integer(trunc(b * 100.0));
    return a_int = b_int;
end function float_eq;

end package body fixed_point_pkg;
EN

回答 2

Stack Overflow用户

发布于 2020-06-05 18:02:05

y_count是寄存器的输入,由else counter_reg表示。y_sum是一个锁存器,由else y_sum指示,然后注册。将else y_sum替换为else sum_reg。

票数 0
EN

Stack Overflow用户

发布于 2020-06-07 07:46:41

试着画出你所描述的硬件的框图,寄存器在哪里,多路复用器在哪里,加法器在哪里等等。然后看看你的工具是否支持rtl网表视图,这样你就可以将你认为写的东西和实际写的东西进行比较。如果您在那里看到任何锁存器,请查看是否可以重写代码/更改设计以将这些更改为寄存器。锁存FPGA不能很好地搭配。然后,你可以按照这两个信号的路径来计算每个信号“相遇”的寄存器数量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62115885

复制
相关文章
【STM32F429】第15章 ThreadX系统时钟节拍和时间管理(绝对延迟和相对延迟)
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99514 第15章 ThreadX系统时钟节拍和时间管理(绝
Simon223
2021/06/24
8460
【STM32H7】第15章 ThreadX系统时钟节拍和时间管理(绝对延迟和相对延迟)
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99514 第15章 ThreadX系统时钟节拍和时间管理(绝
Simon223
2021/06/24
7800
与脑波相关的节拍和噪音
之前在韩国,不知道为什么简书一直登不上。前几天回国了,正在广州酒店隔离中,趁空把最近吸收到的知识整理一下。后面也慢慢地开始适应新阶段的生活。
caoqi95
2020/09/22
6310
与脑波相关的节拍和噪音
FreeRTOS 任务调度 系统节拍
文章 < FreeRTOS 任务调度 任务切换 > 记录了 FreeRTOS 中任务切换的过程, 提到触发任务切换的两种情况 : 高优先级任务就绪抢占和同优先级任务时间共享(包括提前挂起)。 系统中,时间延时和任务阻塞,时间片都以 Systick 为单位。
orientlu
2018/09/13
1.9K0
FreeRTOS 任务调度 系统节拍
简谈 SDRAM的工作原理
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。
FPGA技术江湖
2020/12/29
1.6K0
RTOS内功修炼记(四)— 小小的时钟节拍,撑起了内核半边天!
第一篇文章讲述了任务的三大元素:任务控制块、任务栈、任务入口函数,并讲述了编写RTOS任务入口函数时三个重要的注意点。
Mculover666
2020/07/16
1.2K0
RTOS内功修炼记(四)— 小小的时钟节拍,撑起了内核半边天!
跨时钟域信号的处理方法
在Digital Systems Engineering一书中,亚稳态是这么定义的 When sampling a changing data signal with a clock ... the order of the events determines the outcome.The smaller the time difference between the events, the longer it takes to determine which came first.When two events occur very close together, the decision process can take longer than the time allotted,and a synchronization failure occurs. 亚稳态将导致下一级输入为未知的状态。 为了防止出现亚稳态传输到下一级就要使用同步器了。 在Digital Systems Engineering一书中,同步器是这么定义的 A synchronizer is a device that samples an asynchronous signal and outputs a version of the signal that has transitions synchronized to a local or sample clock. 最常见的就同步器就是两级同步。 在使用两级同步的时候得注意被采样信号的宽度必须大于采样时钟的周期,不然就会出现下图的问题,漏采样。
网络交换FPGA
2019/10/29
1.4K0
跨时钟域信号的处理方法
FreeRTOS学习笔记 | 基础知识体系梳理
我发现学习 RTOS 是学习 Linux 内核的好方法。大有弯道超车的可能。 1. 任务堆栈 1.1 任务栈大小确定 1.2 栈溢出检测机制 2. 任务状态 3. 任务优先级 3.1任务优先级说明 3.2 任务优先级分配方案 3.3 任务优先级与终端优先级的区别 4. 任务调度 4.1 调度器 5. 临界区、锁与系统时间 5.1 临界区与开关中断 5.2 锁 5.3 FreeRTOS 系统时钟节拍和时间管理 一、 单任务系统(裸机) 主要是采用超级循环系统(前后台系统),应用程序是一个无限的循环,循环中调用
刘盼
2022/09/20
3K0
FreeRTOS学习笔记 | 基础知识体系梳理
在总线周期的t1,t2,t3,t4状态,cpu_计算机组成原理总线带宽怎么算
上一关已经设计出了时序发生器FSM,了解了时序发生器的基本原理,这里只需要根据状态 转换图,进一步对输入输出进行设计,在Excel中填写相应表格,自动生成电路。如下。然后在Logisim中自生成电路。
全栈程序员站长
2022/11/04
1.2K0
在总线周期的t1,t2,t3,t4状态,cpu_计算机组成原理总线带宽怎么算
SENT信号介绍
提到车载总线,我们会立马想到经济可靠的CAN、Lin以及成本过高的FlexRay或Ethernet总线。但随着车载传感器数量的增加和对测量精度要求的提升,需要一种相比CAN或Lin更便捷、可靠、经济的车载数据通讯解决方案。
Defry
2022/04/19
2.2K0
SENT信号介绍
信号(Django信号、Flask信号、Scrapy信号)
简介 Django、Flask、scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒。 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者,这是特别有用的设计因为有些代码对某些事件是特别感兴趣的,比如删除动作。 下面,分别介绍一下三种信号的使用示例。 Django信号 很多数情况下,我们需要在操作数据库之前或者之后做某些操作,比如说写个日志之类的,我们当然可以找到每一个sql语句,在其前后加一段代码, 但是,这不但浪费时间,还为以后的维
人生不如戏
2018/07/04
1.4K0
无线WIFI时钟网络子钟无线wifi信号时钟
SYN6123型无线WIFI时钟是一款通过无线wifi技术接收网络NTP时间信息(信息内容:年、月、日、时、分、秒),实现自动对时的网络子钟。子钟带后备电池,停电时不显示,但内部时钟可连续运行72小时,即72小时内恢复供电,可不必对时间进行校准。为用户提供精确、标准、安全、可靠和多功能的时间服务,可用于学校、医院、机场、火车站、地铁、体育馆及金融系统需要显示标准时间的场所。
时频专家
2019/06/27
2K0
【STM32F429】第13章 任务调度—抢占式,时间片和合作式
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99514 第13章 任务调度—抢占式,时间片和合作式 本章教
Simon223
2021/06/24
4260
计算机组成原理:第五章 中央处理器
数据寄存器(Data Register,DR)又称数据缓冲寄存器,其主要功能是作为CPU和主存、外设之间信息传输的中转站,用以弥补CPU和主存、外设之间操作速度上的差异。
Here_SDUT
2022/08/11
2.2K0
计算机组成原理:第五章   中央处理器
【STM32H7】第13章 任务调度—抢占式,时间片和合作式
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99514 第13章 任务调度—抢占式,时间片和合作式 本章教
Simon223
2021/06/24
1.3K0
细说ReactiveCocoa的冷信号与热信号系列(2)
ReactiveCocoa(简称RAC)是最初由GitHub团队开发的一套基于Cocoa的FRP框架。冷信号与热信号的概念很容易混淆并造成一定的问题。鉴于这个问题具有一定普遍性,我将用一系列文章讲解RAC中冷信号与热信号的相关知识点…… 前一篇文章我们介绍了冷信号与热信号的概念,可能有同学会问了,为什么RAC要搞得如此复杂呢,只用一种信号不就行了么?要解释这个问题,需要绕一些圈子。 前面可能比较难懂,如果不能很好理解,请仔细阅读相关文档。 最前面提到了RAC是一套基于Cocoa的FRP框架,那就来说说FRP
美团技术团队
2018/03/12
8800
Mac音乐节拍器软件My Metronome
My metronome mac版是一款Macos上的音乐节拍器软件,是每个喜欢音乐的人的完美工具。它是由专业音乐家创造的,让您感受到一个逼真的节拍器。可以帮助用户稳定地提高自己的演奏速度,以舒适的节奏进行锻炼。
快乐的小丸子
2022/09/29
9870
如何设计嵌入式系统?带你理解一个小型嵌入式操作系统的精髓
1 多任务机制 其实在单一CPU 的情况下,是不存在真正的多任务机制的,存在的只有不同的任务轮流使用CPU,所以本质上还是单任务的。但由于CPU执行速度非常快,加上任务切换十分频繁并且切换的很快,所以我们感觉好像有很多任务同时在运行一样。这就是所谓的多任务机制。 实时系统的特征是延时可预测,能够在一个规定的时间内(通常是 ms 级别的)对某些信号做出反应。 2 任务的状态 任务有下面的特性:任务并不是随时都可以运行的,而一个已经运行的任务并不能保证一直占有 CPU 直到运行完。一般有就绪态,运行态,挂起态等
刘盼
2018/03/16
1.4K0
如何设计嵌入式系统?带你理解一个小型嵌入式操作系统的精髓
L007Linux信号、信号处理和信号处理函数
信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式。在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据。
上善若水.夏
2018/09/28
4.2K0
点击加载更多

相似问题

信号处理:常规音频“节拍”检测

116

时钟节拍和时钟周期的概念

418

Java中的MIDI节拍时钟

10

在节拍数据的价格图上绘制交易进入信号

10

在Javascript中模拟MIDI节拍时钟

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文