verilog笔试题

Use verilog hdl to implement a flip-flop with synchronous RESET and SET, a Flip-flop with asynchronous RESET and SET.

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

异步reset和set
同步reset和set

2、Use verilog hdl to implement a latch with asynchronous RESET and SET.

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

3、Use Verilog hdl to implement a 2-to-1multiplexer.
assign Y=(SEL==1’b0)?A:B;

4、Use AND gate, OR gate and Inverter toimplement a 2-to-1 multiplexer.

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

5、Use a 2-to-1 multiplexer to implement a two input OR gate.

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;

6、Use a tri-state buffer to implement Open-Drain buffer.
assign Y=EN?DataIn:1’bz;

7、To divide one input clock by3, Written by verilog hdl.

module  clk_div_3(clk, reset, clk_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'b10) begin clk_out<=~clk_out;
cnt<=2'b00;end
else cnt<=cnt+1'b1;
end
endmodule
, 占空比1/3

8、To divide one input clock by3, 50% dutycycle is required. Written by verilog hdl.

module  clk_div_3(clk, reset, clk_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

### 实现Verilog中的扫描链设计 在Verilog中实现扫描链设计涉及将多个时序元件连接起来,形成一个或多个串行移位寄存器。这种结构允许通过外部输入端口加载特定数据模式,并通过外部输出端口读取内部状态。 #### 设计思路 为了使时序单元成为伪初级输入(pseudo-primary inputs)和伪初级输出(pseudo-primary outputs),需要引入两个控制信号:`scan_enable` 和 `test_mode`。当处于正常操作模式(`test_mode=0`)下,电路按照常规逻辑工作;而在测试模式(`test_mode=1`)下,则启用扫描路径[^2]。 #### 关键组件定义 - **Scan Flip-Flop (DFF)**: 支持两种不同行为的标准触发器变体。 ```verilog module scan_dff ( input wire clk, input wire reset_n, // active low async reset input wire d, // normal data input input wire si, // serial-in for scan chain input wire se, // scan enable signal output reg q // flip-flop's Q output ); always @(posedge clk or negedge reset_n) begin : proc_scan_ff if (!reset_n) q <= 1'b0; else if (se) q <= si; // during test mode, shift in from SI else q <= d; // otherwise use regular D input end endmodule ``` 此模块展示了如何创建支持扫描功能的D型触发器。它接受标准的数据输入`d`以及用于扫描链路的序列化输入`si`。根据`se`(scan enable)的状态决定是从哪里获取下一个存储值[^4]。 #### 构建完整的扫描链 接下来要做的就是把这些单独的支持扫描特性的触发器串联在一起构成一条连续的链条: ```verilog // Example of connecting multiple scan FFs into a single scan chain. wire [N-1:0] sdi_wires; genvar i; generate for(i = 0; i < N-1; i=i+1) begin : gen_scan_chain assign sdi_wires[i] = (i==0)? si : q_out[i-1]; scan_dff u_scan_dff( .clk(clk), .reset_n(reset_n), .d(d_in[i]), .si(sdi_wires[i]), .se(se), .q(q_out[i]) ); end assign so = q_out[N-1]; // last element connects to SO endgenerate ``` 上述代码片段说明了一个通用的方法来构建任意长度的扫描链。这里假设存在一组平行的数据线作为每个触发器的标准数据源(`d_in[]`),而最终的结果可以通过另一个并行总线(`q_out[]`)获得。此外还提供了一对专门用来处理扫描过程的I/O接口——即`si`(serial-in)和`so`(serial-out)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值