Logic VHDL正交解码器:顺序/组合逻辑

Logic VHDL正交解码器:顺序/组合逻辑,logic,vhdl,sequential,decoder,Logic,Vhdl,Sequential,Decoder,我正在用VHDL实现一个正交解码器,并提出了两个解决方案 在方法1中,所有逻辑都放在一个对时钟和复位敏感的进程中。 在Spartan-3A上,它使用四个片、七个FFs和四个输入LUT 代码1 quadr_解码器的行为体系结构是 信号信道电流:标准逻辑; 信号信道前置:标准逻辑; 信号信道电流:标准逻辑; 信号信道前置:标准逻辑; 开始 过程(n_重置,clk_进入)开始 如果(n_reset='0'),则 --初始化内部信号 chan_a_curr您的代码版本2组合驱动输出,而代码版本1注册输出

我正在用VHDL实现一个正交解码器,并提出了两个解决方案

在方法1中,所有逻辑都放在一个对时钟和复位敏感的进程中。 在Spartan-3A上,它使用四个片、七个FFs和四个输入LUT

代码1

quadr_解码器的行为体系结构是 信号信道电流:标准逻辑; 信号信道前置:标准逻辑; 信号信道电流:标准逻辑; 信号信道前置:标准逻辑; 开始 过程(n_重置,clk_进入)开始 如果(n_reset='0'),则 --初始化内部信号
chan_a_curr您的代码版本2组合驱动输出,而代码版本1注册输出:

  • 计数evt
  • 伯爵迪尔
  • 错误(evt)
这就解释了3个额外的触发器(因为Spartan 3每个片有2个寄存器,这意味着你需要2个额外的片)

虽然代码执行的逻辑功能相同,但它们的行为却不相同。如果/当您将输出连接到另一块输入时,结果将在版本2的1个周期之前可用。假设下游块接受这些输入并应用更多的逻辑,您将看到版本2导致更长的路径,因此可实现的频率更低

一些指南指出,通常应将输出注册到块以改进计时。有时,您希望能够组合地将多个块链接在一起,这样所有的指导原则都会有一些例外。如果任何输出是组合驱动的,最好在声明中进行注释。如果您特别感兴趣,可以使用泛型函数使输出寄存器成为可选的

architecture Behavioral of quadr_decoder is
    signal chan_a_curr : std_logic;
    signal chan_a_prev : std_logic;
    signal chan_b_curr : std_logic;
    signal chan_b_prev : std_logic;
begin
    process (n_reset, clk_in) begin
        if (n_reset = '0') then
            -- initialize internal signals
            chan_a_curr <= '0';
            chan_a_prev <= '0';
            chan_b_curr <= '0';
            chan_b_prev <= '0';
            -- initialize outputs
            count_evt <= '0';
            count_dir <= '0';
            error_evt <= '0';
        elsif (clk_in'event and clk_in = '1') then
            -- keep delayed inputs
            chan_a_prev <= chan_a_curr;
            chan_b_prev <= chan_b_curr;
            -- read current inputs
            chan_a_curr <= chan_a;
            chan_b_curr <= chan_b;
            -- detect a count event
            count_evt <= ((chan_a_prev xor chan_a_curr) xor
                          (chan_b_prev xor chan_b_curr));
            -- determine count direction
            count_dir <= (chan_a_curr xor chan_b_prev xor 
                          count_mode);
            -- detect error conditions
            error_evt <= ((chan_a_prev xor chan_a_curr) and 
                          (chan_b_prev xor chan_b_curr));
        end if;
    end process;
end Behavioral;
architecture Behavioral of quadr_decoder is
    signal chan_a_curr : std_logic;
    signal chan_a_prev : std_logic;
    signal chan_b_curr : std_logic;
    signal chan_b_prev : std_logic;
begin
    process (n_reset, clk_in) begin
        if (n_reset = '0') then
            -- initialize internal signals
            chan_a_curr <= '0';
            chan_a_prev <= '0';
            chan_b_curr <= '0';
            chan_b_prev <= '0';
        elsif (clk_in'event and clk_in = '1') then
            -- keep delayed inputs
            chan_a_prev <= chan_a_curr;
            chan_b_prev <= chan_b_curr;
            -- read current inputs
            chan_a_curr <= chan_a;
            chan_b_curr <= chan_b;
        end if;
    end process;

    process (chan_a_prev, chan_a_curr, chan_b_prev, chan_b_curr) begin
            -- detect a count event
            count_evt <= ((chan_a_prev xor chan_a_curr) xor 
                          (chan_b_prev xor chan_b_curr));
            -- determine count direction
            count_dir <= (chan_a_curr xor chan_b_prev xor count_mode);
            -- detect error conditions
            error_evt <= ((chan_a_prev xor chan_a_curr) and 
                         (chan_b_prev xor chan_b_curr));
    end process;
end Behavioral;