首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Verilog: MUX的代码

Verilog: MUX的代码
EN

Stack Overflow用户
提问于 2017-07-16 16:29:07
回答 1查看 3.1K关注 0票数 0

我正在编写verilog代码,要求如下:它是完全同步的。在11条总线之间实现Muxes,其中每条总线有8位宽.它有两个周期的延迟。它对最大时钟频率进行了优化。

到目前为止,我已经编写了以下代码:

代码语言:javascript
复制
    module muxcase (a,b,c,d,e,f,g,h,i,j,k, select, op, clk, reset);
input [7:0] a,b,c,d,e,f,g,h,i,j,k;
input [3:0] select;
output [7:0] op;
reg op;
input reset, clk;
integer count= 2’b00;
integer temp= 2’b00;
always @ (posedge clk)
begin 

if (reset==1’b1)
begin
count=2’b00;
op=8’b00000000;
select=4’b0000;
end
if (reset==1’b0)
begin 
if (count <3)
begin
count=count+1;
temp=count;
end
end

case (select)
4’b0000: op=a;
4’b0001: op=b;
4’b0010: op=c;
4’b0011: op=d;
4’b0100: op=e;
4’b0101: op=f;
4’b0110: op=g;
4’b0111: op=h;
4’b1000: op=i;
4’b1001: op=j;
4’b1010: op=k;
endcase

end
endmodule

现在,我不知道如何合并最大clk频率部分,以及我的计数器两个时钟周期是否有正确的逻辑。如能对此提供任何帮助,将不胜感激。

试验台:

代码语言:javascript
复制
    module mux_tb;
    reg [7:0] a,b,c,d,e,f,g,h,i,j,k;
    reg [3:0] select;

    wire [7:0] op;

    initial
    begin
    a =1,b =1,c = 0,d=0,e=0,f=1,g=1,h=0,i=1,j=0,k=1;
    s=4’b0000;
    #5 s=4’b0011;
    #5 s=4’b0111;
    #5 s=4’b1010;
    end
    muxcase f1 (a,b,c,d,e,f,g,h,I,j,k, select, op, clk, reset);

    endmodule
EN

回答 1

Stack Overflow用户

发布于 2017-07-18 21:14:17

为了优化最大时钟频率,您需要最小化两个FFs (流水线)之间的门逻辑。也就是说,我们不需要在单个时钟周期中进行非常长的计算,而是要求时钟周期非常长(低频),我们将计算分解为许多小的计算,通过进行更多的时钟周期,但时钟周期更短(高频)。所以很明显,这是延迟和吞吐量之间的权衡。

要对mux进行管道处理,我建议使用分层mux树。让我们简单地说,您有4个输入。我们可以使用两个小的mux,使输入1和2平行于输入3和4。我们可以采样这两个mux的输出,然后在下一个周期mux 1和mux 2的输出之间采样,这是我们在前一个时钟周期中计算出来的。

下面您可以看到一个4到1流水线mux的例子,延迟为2,您可以很容易地将它扩展到更多的输入。请注意:

  • 您有11个输入到mux,因此您的mux树将不平衡。
  • 您应该为每个阶段使用不同的select位。
  • 您应该与数据一起对select进行示例

个人而言,我本来会编写完全不同的编码风格,但我试图让它尽可能接近您的代码,以使您更容易理解它。而且,我没有检查它的编译或行为是否与预期的相同

代码语言:javascript
复制
module pipelined_mux_4to1 (
    input clk, 
    input [1:0] select,
    input [7:0] a,
    input [7:0] b,
    input [7:0] c,
    input [7:0] d,
    output reg [7:0] out
);

//first cycle muxes
reg [7:0] mux_a_b;

always @*
     case (select[0])
         1'b0 : mux_a_b = a;
         1'b1 : mux_a_b = b;
         default: mux_a_b = {7{1'bx}};
     endcase

reg [7:0] mux_c_d;

always @*
     case (select[0])
         1'b0 : mux_c_d = c;
         1'b1 : mux_c_d = d;
         default: mux_c_d = {7{1'bx}};
     endcase

//sample first muxes stage and the select
reg [7:0] mux_a_b_ff;
reg [7:0] mux_c_d_ff;
reg select_msb_ff;

always @(posedge clk) begin
      mux_a_b_ff <= mux_a_b;
      mux_c_d_ff <= mux_c_d;          
      select_msb_ff <= select[1];
end

//second cycle mux    
reg [7:0] mux_final;

always @*
     case (select_msb_ff)
         1'b0 : mux_final = mux_a_b_ff;
         1'b1 : mux_final = mux_c_d_ff;
         default: mux_final = {7{1'bx}};
     endcase

//sample second mux stage
always @(posedge clk)
     out <= mux_final;

endmodule
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45130869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档