简体   繁体   中英

Is it legal to have an independent if-clause for the D flip-flop reset in VHDL?

I have the following code describing some registers:

    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;

This code works except for the fact that the clear_rd_dma_req is ignored when DCR_WRITE is active. So, can I somehow make the "if clear_rd_dma_req='1'" clause an independent one? I realize that I can create a separate process just for the rd_dma_req bit, but I am trying to avoid that as I have a few bits like that.

Here's a version with a separate process:

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;

And here's a version with an independent if-clause, which is probably illegal:

    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;

Thanks

Yes you can make it an independent one (still inside the if rising_edge(clk) statement). What makes you think this version (last in the modified question) should be illegal?

Anything it does will override assignments made to the same signals by the if DCR_Write statement, thanks to the "last assignment wins" rule.

HOWEVER why not simply reverse the prioritisation and tidy it up, like this?

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM