专栏名称: 中国IC精英人才圈
分享行业信息、职业规划、企业咨询
目录
相关文章推荐
疯狂区块链  ·  清北的毕业证,和清北的学习,你选哪个? ·  昨天  
白话区块链  ·  入局Web3,索尼为何不直接选比特币? ·  昨天  
疯狂区块链  ·  每个人都应该“自私”一点 ·  2 天前  
疯狂区块链  ·  好学校到底有没有用? ·  3 天前  
疯狂区块链  ·  搞懂了这三件事,你就理解了人类社会 ·  5 天前  
51好读  ›  专栏  ›  中国IC精英人才圈

Verilog常见必备面试题

中国IC精英人才圈  · 公众号  ·  · 2020-10-30 16:51

正文

公众号:ZYNQ

ID:FreeZynq


  1. 使用verilog hdl实现具有同步RESET和SET的触发器,具有异步RESET和SET的触发器。

异步reset和set

always@(posedge clk or negedge reset or posedge set)
begin
  if(set)
  Q<=1;
    else if(!reset)
  Q<=0;
    else
  Q<=D;
end

同步reset和set

always@(posedge clk)
begin
  if(set)
    Q<=1;
  else if(!reset)
    Q<=0;
  else
    Q<=D;
end
  1. 使用verilog hdl通过异步RESET和SET实现锁存器。

always @(clk or reset or set)
begin
  if(set)
    Q=1;
  else if(!reset)
    Q=0;
  else
    Q=D;
end
  1. 使用Verilog hdl实现2对1多路复用器。

assign Y=(SEL==1'b0)?A:B;
  1. 使用AND门,OR门和反相器实现2对1多路复用器。

module MUX21(A, B, SEL, Y);
  input A,B,SEL;
  output Y;
  net SEL_NOT, A_AND, B_AND;
  not u0(SEL_NOT, SEL);
  and u1(A_AND, SEL_NOT, A);
  and u2(B_AND, SEL, B);
  or u3(Y, A_AND, B_AND);
endmodule
  1. 使用2对1多路复用器实现两个输入“或”门。

module or2(A, B, Y);
  input A, B;
  output Y;
  MUX21 u0(Y, A, B, B );
endmodule

module MUX21(Y, A ,B, SEL)
  input A,B,SEL;
  output Y;
  assign Y=(SEL==1’b0):A:B;
endmodule

assign Y=A?A:B;
  1. 使用三态缓冲器来实现漏极开路缓冲器。

assign Y=EN?DataIn:1'bz;
  1. 将一个输入时钟除以3,由verilog hdl编写。

module clk_div_3(clkresetclk_out);
  input reset,clk;
  output clk_out;
  reg clk_out;
  reg [1:0] cnt;
  always@(posedge clk or negedge reset)
  begin
    if(!reset)
      begin cnt<=2'b00;
        clk_out<=0;
      end
    else if(cnt==2'
b01) begin clk_out<=~clk_out;
      cnt<=cnt+1'b1; end
    else if(cnt==2'
b10begin clk_out<=~clk_out;
      cnt<=2'b00;end
    else cnt<=cnt+1'
b1;
  end
endmodule

占空比1/3


  1. 要将一个输入时钟除以3,需要50%的占空比,由verilog hdl编写。

module clk_div_3(clkresetclk_out);
  input reset,clk;
  output clk_out;
  reg clk_out1, clk_out2;
  reg [1:0] cnt1,cnt2;
  assign clk_out = clk_out1 | clk_out2;
  always@(posedge clk or negedge reset)
  begin
    if(!reset)
    begin cnt1<=2'b00;
    clk_out1<=0;end
    else if(cnt1==2'b01) begin clk_out1<=~clk_out1;
    cnt1<=cnt1+1'b1; end
    else if(cnt1==2'b10) begin clk_out1<=~clk_out1;
    cnt1<=2'b00;end
    else cnt1<=cnt1+1'b1;
  end

  always@(negedge clk or negedge reset)
  begin
    if(!reset)
    begin cnt2<=2'b00;
      clk_out2<=0;
    end
    else if(cnt2==2'b01) begin clk_out2<=~clk_out2;
      cnt2<=cnt2+1'b1; end
    else if(cnt2==2'b10) begin clk_out2<=~clk_out2;
      cnt2<=2'b00;end
    else cnt2<=cnt2+1'b1;
  end
endmodule


module clk_div_3(clk, reset, clk_out);
  input reset,clk;
  output clk_out;
  reg [1:0] cnt;
  reg clk_out1, clk_out2;
  always@(posedge clk)
    begin
    if(!reset)
      cnt<='d0;
    else if(cnt=='d2)
      cnt<='d0;
    else
      cnt<=cnt+1;
  end

  always @(posedge clk or negedge reset)
  begin
    if(!reset)
      clk_out1<='d0;
    else if(cnt=='d2)
      clk_out1<=~clk_out1;
    else if(cnt == 'd1)
      clk_out1<=~clk_out1;
  end

  always @(negedge clk or negedge reset)
  begin
    if(!reset)
      clk_out2<='d0;
    else if(cnt=='d2)
      clk_out2<=~clk_out2;
    else if(cnt == 'd1)
      clk_out2<=~clk_out2;
  end
  assign clk_out = clk_out1 | clk_out2;
endmodule

‧  END