在VHDL中为D触发器复位有一个独立的if子句是否合法?

时间:2015-12-16 15:19:53

标签: vhdl clear flip-flop

我有以下代码描述了一些寄存器:

    DCR_WR_REGS_P: process (CLK)
    begin
        if rising_edge(CLK) then
            if DCR_WRITE = '1' then
               if C_BASEADDR(0 to 6) = DCR_ABUS(0 to 6) then
                    case to_integer(unsigned(DCR_ABUS(7 to 9))) is
                       when REG_DMA_RD_ADDR_OFFS =>
                            dma_rd_addr_reg <= DCR_WR_DBUS (0 to DMA_RD_ADDR_SZ-1);                              
                       when REG_DMA_RD_LENG_OFFS =>
                            dma_rd_leng_reg <= DCR_WR_DBUS (0 to DMA_RD_LENG_SZ-1);
                            rd_dma_req <= '1';
                       -- more registers here...
                       when

                       when
                       ----------------------
                       when others =>
                    end case;
                end if;
            else
                if clear_rd_dma_req='1' then
                    rd_dma_req <='0';
                end if;
            end if;
        end if;
    end process DCR_WR_REGS_P;

此代码有效,但DCR_WRITE处于活动状态时忽略clear_rd_dma_req的事实除外。所以,我可以以某种方式制作&#34;如果clear_rd_dma_req =&#39; 1&#39;&#34;条款是独立的吗?我意识到我可以为rd_dma_req位创建一个单独的进程,但我试图避免这种情况,因为我有几个这样的位。

这是一个具有单独流程的版本:

DCR_WR_REGS_P: process (CLK)
begin
    if rising_edge(CLK) then
        if DCR_WRITE = '1' then
           if C_BASEADDR(0 to 6) = DCR_ABUS(0 to 6) then
                case to_integer(unsigned(DCR_ABUS(7 to 9))) is
                   when REG_DMA_RD_ADDR_OFFS =>
                        dma_rd_addr_reg <= DCR_WR_DBUS (0 to DMA_RD_ADDR_SZ-1);                              
                   when REG_DMA_RD_LENG_OFFS =>
                        dma_rd_leng_reg <= DCR_WR_DBUS (0 to DMA_RD_LENG_SZ-1);
                   -- more registers here...
                   when

                   when
                   ----------------------
                   when others =>
                end case;
            end if;
        end if;
    end if;
end process DCR_WR_REGS_P;

RD_DMA_REQ_P: process (CLK)
begin
    if rising_edge(CLK) then
        if clear_rd_dma_req='1' then
            rd_dma_req <='0';
        elsif DCR_WRITE = '1' then
            if C_BASEADDR(0 to 6) = DCR_ABUS(0 to 6) then
                if to_integer(unsigned(DCR_ABUS(7 to 9))) = REG_DMA_RD_LENG_OFFS then
                    rd_dma_req <= '1';
                end if;
            end if;
        end if;
    end if;
end process RD_DMA_REQ_P;

这是一个带有独立if子句的版本,这可能是非法的:

    DCR_WR_REGS_P: process (CLK)
    begin
        if rising_edge(CLK) then
            if DCR_WRITE = '1' then
               if C_BASEADDR(0 to 6) = DCR_ABUS(0 to 6) then
                    case to_integer(unsigned(DCR_ABUS(7 to 9))) is
                       when REG_DMA_RD_ADDR_OFFS =>
                            dma_rd_addr_reg <= DCR_WR_DBUS (0 to DMA_RD_ADDR_SZ-1);                              
                       when REG_DMA_RD_LENG_OFFS =>
                            dma_rd_leng_reg <= DCR_WR_DBUS (0 to DMA_RD_LENG_SZ-1);
                            rd_dma_req <= '1';
                       -- more registers here...
                       when

                       when
                       ----------------------
                       when others =>
                    end case;
                end if;
            end if;
            if clear_rd_dma_req='1' then
                rd_dma_req <='0';
            end if;
        end if;
    end process DCR_WR_REGS_P;

由于

1 个答案:

答案 0 :(得分:1)

是的,你可以把它作为一个独立的(仍然在if rising_edge(clk)声明中)。是什么让你认为这个版本(修改后的问题中的最后一个)应该是非法的?

它执行的任何操作都将覆盖if DCR_Write语句对相同信号所做的分配,这要归功于&#34;最后一次分配获胜&#34;规则。

但是,为什么不简单地反转优先级并整理它,像这样?

if clear_rd_dma_req='1' then
   ...
elsif DCR_Write = '1' then
   ... 
end if;