牛客:VL29 信号发生器

题目:

描述

题目描述:

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

       模块的接口信号图如下:

       模块的时序图如下:

请使用Verilog HDL实现以上功能,并编写testbench验证模块的功能

输入描述:

clk:系统时钟信号

rst_n:异步复位信号,低电平有效

wave_choise:2比特位宽的信号,根据该信号的取值不同,输出不同的波形信号

输出描述:

wave:5比特位宽的信号,根据wave_choise的值,输出不同波形的信号

提交结果:

参考题解中第一个思路,信号发生器

(1)波形信号存在周期要求

(2)锯齿波产生

(3)三角波产生

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

	reg [4:0]cnt;
	reg flag;

	//方波计数器
	always@(negedge rst_n, posedge clk)begin
		if (~rst_n)
		cnt <= 0;
		else
		cnt <= wave_choise != 0 ? 0 :
		       cnt         == 19 ? 0 :
			   cnt + 1;
	end

	always@(negedge rst_n, posedge clk)begin
		if (~rst_n)
		flag <= 0;
		else
		flag <= wave_choise != 2 ? 0 :
		        wave == 19 ? 0 : 
				wave == 1  ? 1 : flag;
	end

	always@(negedge rst_n, posedge clk) begin
		if (~rst_n)
		wave <= 0;
		else begin
			case(wave_choise)
			0: wave <= cnt == 9 ? 20 : 
			           cnt == 19 ? 0 : wave;
			1: wave <= wave == 20 ? 0 : wave + 1;
			2: wave <= flag ? wave + 1 : wave - 1;
			default: wave <= 0;
			endcase
		end
	end

  
endmodule

tb文件

`timescale 1ns/1ns
module testbench();

	reg clk,rst_n;
	reg [1:0]wave_choise;
	wire [4:0]wave;

	
initial begin
	$dumpfile("out.vcd");
	$dumpvars(0,testbench);
	clk = 0;
	rst_n = 0;
	#2 rst_n = 1;

end

initial begin
	#100 $finish;
end

always #1 clk = !clk;

initial begin
	wave_choise = 0;
	#40 wave_choise = 1;
	#40 wave_choise = 2;
end



signal_generator dut(
	.clk(clk),
	.rst_n(rst_n),
	.wave_choise(wave_choise),
	.wave(wave)
	);
endmodule

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值