Verilog仲裁器,”极简主义“,看看我需要多少行代码
3赞
发表于 2017/1/18 16:48:48
阅读(1663)
评论(7)
用途:仲裁器,优先级仲裁,非轮询仲裁,用于多路选择仲裁,DDR,AXI,AVALON这些,addr地址自动跳跃到下一个empty的通道。
1、可综合
2、自定义路数,数量无边界
3、几乎没人敢这么写......
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行代码))
首先,有人这么写;
然后,还是不够简洁。
一个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;
你提供的资料真是太有用了
你提供的资料真是太有用了
是的