牛客进阶题目5:信号发生器

这个题目有点离谱,题里什么也没给,需要去题解中才知道方波、锯齿波和三角波最大值都为20,方波周期20,锯齿波周期21,三角波周期40

对三种波形具体分析

方波:周期为20且最大值也为20的方波,就是0-19的计数器,在0-9时wave输出0,在10-19wave输出20。

锯齿波:wave即为0-20计数器,在0-19过程中持续增加,在计数器为20时进行清零

三角波:wave为0-19和19到0的先加再减计数器,0-19过程中递增,19-0过程中递减。

波形里存在一个小三角,是陷阱,要求在从锯齿波或者方波切换到三角波时,默认在递减状态,减到0时才开始递增。

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

always @(posedge clk or negedge rst_n) begin
	if(!rst_n) 
		cyc_count <= 'd0 ;
	else if(wave_choise==2'd0) begin
		if(cyc_count == 5'd19)
			cyc_count <= 5'd0 ;
		else
			cyc_count <= cyc_count + 1;
	end
	else
		cyc_count <= 5'd0 ;
end

always @(posedge clk or negedge rst_n) begin
	if(!rst_n)
		flag <= 1'b0 ;
	else if(wave_choise == 2'd2) begin
		if(wave == 5'd19)
			flag <= 1'b1 ;
		else if(wave == 5'd1)
			flag <= 1'b0 ;
		else
			flag <= flag ;
	end
	else begin
		if(wave == 5'd0 )
			flag <= 1'b0 ;
		else
			flag <= 1'b1 ;
	end
end

always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        wave<=0;
    else begin
        if (wave_choise==0) begin
            wave <= (cyc_count < 9) ? 0 : (cyc_count < 19 ? 20 : 0);
        end
        else if (wave_choise==1) begin
            wave <= (wave >= 20) ? 0 : wave+1;
        end
        else if (wave_choise==2) begin
            wave <= flag ? wave-1: wave+1;
        end
        else
            wave <= 0;
    end
end
endmodule
posted @   骑猪上树的少年  阅读(96)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
回到顶部
点击右上角即可分享
微信分享提示