Verilog:MUX 的代码

Posted

技术标签:

【中文标题】Verilog:MUX 的代码【英文标题】:Verilog: code for MUX 【发布时间】:2017-07-16 16:29:07 【问题描述】:

我正在编写具有以下要求的 verilog 代码: 它是完全同步的。 在 11 条总线之间实现多路复用器,其中每条总线为 8 位宽。 它有 2 个延迟周期。 它已针对最大时钟频率进行了优化。

到目前为止,我已经编写了这段代码:

    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 频率部分以及我的 2 个时钟周期的计数器是否具有正确的逻辑。任何有关这方面的帮助将不胜感激。

测试台:

    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

【问题讨论】:

我现在将尝试对此进行更多研究。我可以告诉你的一个问题是implied latchimplied latch 发生在您未涵盖所有案例时。在这种情况下,您有 4 位可用于所有情况,但您只使用 0-10。使用default 的情况:例如default: op=a 好的,谢谢。我将添加默认情况。 没有问题,那么op 是你的输出吗? 是的op是mux的输出 请缩进示例中的代码以使其可读。 【参考方案1】:

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

要对多路复用器进行管道化,我建议使用分层多路复用器树。 为简单起见,假设您有 4 个输入。我们可以使用两个小型复用器将输入 1 和 2 与输入 3 和 4 并行复用。 我们可以对这两个复用器的输出进行采样,然后在复用器 1 和复用器 2 的输出之间的下一个周期复用器,这是我们在前一个时钟周期计算的。

您可以在下面看到延迟为 2 的 4 对 1 流水线多路复用器的示例。 您可以轻松地将其扩展到更多输入。 请注意:

您有 11 个多路复用器输入,因此您的多路复用器树将不平衡。 您应该为每个阶段使用不同的选择位 您应该与数据一起采样选择

就我个人而言,我会用完全不同的编码风格来编写它,但我试图让它尽可能接近你的,让你更容易理解。另外,我没有检查它是否按预期编译或运行

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 = 71'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 = 71'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 = 71'bx;
     endcase

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

endmodule

【讨论】:

以上是关于Verilog:MUX 的代码的主要内容,如果未能解决你的问题,请参考以下文章

使用稍后在 verilog 中定义的条件变量

流水线cpu —Verilog HDL

数字IC设计verilog编写——5无毛刺时钟MUX设计

数字IC设计verilog编写——5无毛刺时钟MUX设计

行为verilog:使用1个模块创建多个多路复用器

Verilog 算术和逻辑单元 (ALU) 编译错误