牛客网Verilog刷题——VL29

牛客网Verilog刷题——VL29

题目

  请编写一个信号发生器模块,根据波形选择信号wave_choise发出相应的波形:wave_choice=0时,发出方波信号;wave_choice=1时,发出锯齿波信号;wave_choice=2时,发出三角波信号。
  模块的信号接口图如下:

在这里插入图片描述
  模块的时序图如下:

在这里插入图片描述

  请使用Verilog HDL实现以上功能。

信号类型输入/输出位宽描述
clkwireIntput1系统时钟信号
rst_nwireIntput1异步复位信号,低电平有效
wave_choisewireIntput22比特位宽的信号,根据该信号的取值不同,输出不同的波形信号
waveregIntput55比特位宽的信号,根据wave_choise的值,输出不同波形的信号

答案

`timescale 1ns/1ns
module signal_generator(
	input clk,
	input rst_n,
	input [1:0] wave_choise,
	output reg [4:0]wave
	);
reg		[4:0]	cnt1;
reg				up;


always @(posedge clk or negedge rst_n)
	if(!rst_n)
		cnt1 <= 'd0;
	else if(wave_choise== 2'd0)
		if(cnt1=='d19)
			cnt1 <= 'd0;
		else
			cnt1 <= cnt1 + 1'd1;
	else
		cnt1 <= 'd0;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		up <= 1'b0;
	else if(wave_choise==2'd2)
		if(wave=='d20)
			up <= 1'b0;
		else if(wave=='d0)
			up <= 1'b1;
		else
			up <= up;
	else
		up <= 1'b0;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		wave <= 'd0;
	else
		case(wave_choise)
		2'b00: //方波
			begin
				if(cnt1=='d19)
					wave <= 'd0;
				else if(cnt1 == 'd9)
					wave <= 'd20;
				else
					wave <= wave;
			end
		
		2'b01: //锯齿波
			begin
				if(wave=='d20)
					wave <= 'd0;
				else
					wave <= wave + 1'd1;
			end
		
		2'b10: //三角波
			begin
				if(wave == 'd20)
					begin
						wave <= wave - 1'd1;
					end
				else if(wave == 'd0)
					begin
						wave <= wave + 1'd1;
					end
				else if(up)
					wave <= wave + 1'd1;
				else
					wave <= wave - 1'd1;
			end
		default:wave <= 'd0;
		endcase
  
endmodule
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值