吴明

Verilog仲裁器,”极简主义“,看看我需要多少行代码

3
阅读(620) 评论(7)

用途:仲裁器,优先级仲裁,非轮询仲裁,用于多路选择仲裁,DDR,AXI,AVALON这些,addr地址自动跳跃到下一个empty的通道。

1、可综合

2、自定义路数,数量无边界

3、几乎没人敢这么写......


捕获.PNG


  1. @ad605   


    2017-04-15 12-47-28屏幕截图.png

    1,关于代码的应答,一部分在截图里,直接贴代码很难看懂。

    2 ,你怎么就这么断定我没有一个function,下面才是最简版

        parameter NUM;

        parameter  NSIZE = $clog2(NUM);

        input [NUM-1:0]    req;

        output logic [NSIZE-1:0]    addr;

        always_comb begin

            addr = '0;

            for(int i=0;i<NUM;i++)

                addr = req[i] ? i : addr

        end

    3,状态机和简洁似乎没有太多关系,fifo没有状态机,里面信号可不简洁,axi4握手交换就因为用了状态机才简洁的(里面就一个状态机+(2-4行代码))

  2. 首先,有人这么写;

    然后,还是不够简洁。

    一个function就能搞定的事,何必状态机

    用了状态机,就不要扯简洁了

    附上类似功能的 vhdl版,略做交流


    process (clk,rst)

    variable n : integer;

    variable done : std_logic;

    begin

    if(rst = '1') then

    pos_data <= (others=>'1');

    mask <= (others=>'1');

    elsif(rising_edge(clk)) then

    if(data_valid='1') then

    mask <= (others=>'1');

    pos_data <= (others=>'0');

    else

    done:='0';

    for n in 0 to data'length-1 loop

    if(data(n)='1' and mask(n)='1' and done='0' and pos_rd='1') then --

    pos_data <= conv_std_logic_vector(n,log2_wid);

    mask(n) <= '0';

    done := '1';

    end if;

    end loop;

    end if;

    end if;

    end process;


  3. 你提供的资料真是太有用了

  4. 你提供的资料真是太有用了

  5. @七夜浮生   

    用的是System Verilog么

    是的

  6. 用的是System Verilog么

  7. 用的是System Verilog么