Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可变大小的位移位寄存器vhdl_Vhdl - Fatal编程技术网

可变大小的位移位寄存器vhdl

可变大小的位移位寄存器vhdl,vhdl,Vhdl,我试图获得两个输出(pulse(0)和pulse(1)),以提供一个短的单时钟脉冲。这些脉冲之间的延迟需要由一些输入值控制。因此0x1=1个时钟周期等 目前,一旦触发器打开,它将保持打开状态 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.numeric_std.all; use work.ipbus.all; <...snip> architecture rtl of trig_latency is signal ac

我试图获得两个输出(
pulse(0)和pulse(1)
),以提供一个短的单时钟脉冲。这些脉冲之间的延迟需要由一些输入值控制。因此0x1=1个时钟周期等

目前,一旦触发器打开,它将保持打开状态

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.numeric_std.all;
use work.ipbus.all;

<...snip>


architecture rtl of trig_latency is

signal ack : std_logic;
signal s_level : unsigned(pulse'range);
signal s_level_d1 : std_logic;
signal bit_shift : std_logic_vector(addr_width downto 0);
signal latency: integer:=5;


begin
latency <= to_integer(unsigned(in_data(addr_width -1 downto 0))) when addr_width > 0 else 0;
    process(clk)
        begin
            if rising_edge(clk) then
                if ipbus_in.ipb_strobe='1' and ipbus_in.ipb_write = '1' then
                    s_level <= s_level + 1;
                    s_level_d1<=s_level(s_level'left);
                              else
                               s_level<=(others=>'0);


                end if;

                bit_shift <= bit_shift(bit_shift'high-1 downto 0) & (s_level(s_level'left) and (not s_level_d1));
                ipbus_out.ipb_rdata <= (others => '0');
                ack <= ipbus_in.ipb_strobe and not ack; 

                pulse(0) <= s_level(s_level'left) and (not s_level_d1);
                pulse(1)<=bit_shift(latency);

            end if;

    end process;

  ipbus_out.ipb_ack <= ack;
  ipbus_out.ipb_err <= '0';

end rtl;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用ieee.numeric_std.all;
使用work.ipbus.all;
触发延迟的rtl架构是
信号确认:标准逻辑;
信号s_电平:无符号(脉冲范围);
信号s_电平_d1:标准逻辑;
信号位移位:标准逻辑向量(加法宽度减至0);
信号延迟:整数:=5;
开始
延迟0,其他0;
过程(clk)
开始
如果上升沿(clk),则
如果ipbus_in.ipb_strobe='1'和ipbus_in.ipb_write='1',则

s_level为什么你不能将你的位一直移动,而忽略它们在
N
之上的事实呢。通常的VHDL移位器使用
&
将移位寄存器与新值连接起来:

bit_shift <= bit_shift(bit_shift'high-1 downto 0) & s_level;

bit\u shift。这对我给出的示例有效,但当我更改此代码以确保它提供的是单个脉冲而不是两个脉冲时,它会中断。您能显示一些波形吗?例如,in_数据在做什么?in_数据实际上只是停留在一个值上,比如1、2、3、4等。我知道它是有效的,因为我已经多次使用它。不幸的是,由于各种原因,我很难得到波形。它基本上显示第一个触发器触发,保持打开,然后几个时钟周期后,第二个触发器触发并保持打开。我怀疑它与位移位寄存器中的逻辑有关,即使我删除“in_data”并将该数字作为常量,它仍然保持脉冲逻辑高。所以我真正需要的是:其他s_水平'0');这就是为什么波形会有帮助-我认为你的问题是获得正确的延迟。我错过了你的最新消息,说第二个扳机还在!