牛客进阶题目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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】