牛客网Verilog刷题——VL24

牛客网Verilog刷题——VL24

题目

  有一个缓慢变化的1bit信号a,编写一个程序检测a信号的上升沿给出指示信号rise,当a信号出现下降沿时给出指示信号down。
  注:rise,down应为单脉冲信号,在相应边沿出现时的下一个时钟为高,之后恢复到0,一直到再一次出现相应的边沿。

在这里插入图片描述

信号类型输入/输出位宽
clkwireIntput1
rst_nwireIntput1
awireIntput1
riseregOutput1
downregOutput1

答案

错误答案
  刚开始,用最常用的连续赋值语句来判断上升沿和下降沿,然后对信号打拍后得到rise信号和down信号,如下。

`timescale 1ns/1ns
module edge_detect(
	input clk,
	input rst_n,
	input a,
	
	output reg rise,
	output reg down
);

reg  r_a;
wire w_rise = 1'b0;
wire w_down = 1'b0;

always @(posedge clk or negedge rst_n)
  if(!rst_n)
    r_a <= 1'b0;
  else
    r_a <= a;

assign w_rise = a & (~r_a);
assign w_down = (~a) & r_a;

always @(posedge clk or negedge rst_n)
  if(!rst_n) begin
    rise <= 1'b0;
	down <= 1'b0;
  end
  else begin
    rise <= w_rise;
	down <= w_down;
  end
    
endmodule

  然后,仿真一直保持,用例不通过,查看波形,原来是当a是不定态X的时候,使用连续赋值语句采集到的上升沿信号w_rise与下降沿信号w_down均为不定态X,如下图。
在这里插入图片描述

  而采用if-else语句则可以避免该错误,因为在if-else语句中,0、X、Z均按照“假”来处理。
在这里插入图片描述

在这里插入图片描述
  上面两张图分别是使用连续赋值语句和if-else获取上升沿的结果,可以看到,在复位之后,输入的单比特数据a仍然为不定态X,此时使用连续赋值语句assign获取到的上升沿信号rise为不定态X,而使用if-else语句获取到的上升沿信号rise为低电平。

正确答案

`timescale 1ns/1ns
module edge_detect(
	input clk,
	input rst_n,
	input a,
	
	output reg rise,
	output reg down
);
reg	a_dly;
always @(posedge clk or negedge rst_n) 
	if(!rst_n)
		a_dly <= 1'b0;
	else
		a_dly <= a;

always @(posedge clk or negedge rst_n)
	if(!rst_n) begin
		rise <= 1'b0;
		down <= 1'b0;
	end
	else begin
		if(a & (~a_dly)) begin
			rise <= 1'b1;
			down <= 1'b0;
		end
		else if((~a) & a_dly) begin
			rise <= 1'b0;
			down <= 1'b1;
		end
		else begin
			rise <= 1'b0;
			down <= 1'b0;
		end
	end
endmodule
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值