题解 | 信号发生器
題解裏面看了好幾個,都遺漏了方波和鋸齒波為0時轉三角波的情況,用以下仿真代碼跑會出現wave到31的情況
`timescale 1ns/1ns
module signal_generator(
input clk,
input rst_n,
input [1:0] wave_choise,
output reg [4:0]wave
);
reg [5:0] cnt;
reg rev;
reg [1:0] wave_reg;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) begin
cnt<=6'd0;
end else if(cnt == 6'd19) begin
cnt<=6'd0;
end else if(wave_choise == 2'd0) begin
cnt<=cnt + 1'b1;
end else begin
cnt<=6'd0;
end
end
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) begin
rev<=1'b0;
end else if(wave_choise == 2'd2 && wave == 5'd19) begin
rev<=1'b0;
end else if(wave_choise == 2'd2 && wave == 5'd1) begin
rev<=1'b1;
end else if(wave_choise == 2'd0 && cnt == 5'd19) begin
rev<=1'b1;
end else if(wave_choise == 2'd0 && cnt != 5'd19) begin
rev<=1'b0;
end else if(wave_choise == 2'd1 && wave == 5'd20) begin
rev<=1'b1;
end else if(wave_choise == 2'd1 && wave != 5'd20) begin
rev<=1'b0;
end
end
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) begin
wave <=5'd0;
end else if(wave_choise == 2'd0) begin
if (cnt == 6'd9) begin
wave <=5'd20;
end else if (cnt == 6'd19) begin
wave <=5'd0;
end
end else if(wave_choise == 2'd1) begin
if (wave == 5'd20) begin
wave <=5'd0;
end else begin
wave <= wave + 1'b1;
end
end else if(wave_choise == 2'd2) begin
if (rev == 1'b1) begin
wave <= wave + 1'b1;
end else if (rev == 1'b0) begin
wave <= wave - 1'b1;
end
end
end
endmodule
或者這樣也可以吧
`timescale 1ns/1ns
module signal_generator(
input clk,
input rst_n,
input [1:0] wave_choise,
output reg [4:0]wave
);
reg [5:0] cnt;
reg rev;
reg [1:0] wave_reg;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) begin
cnt<=6'd0;
end else if(cnt == 6'd19) begin
cnt<=6'd0;
end else if(wave_choise == 2'd0) begin
cnt<=cnt + 1'b1;
end else begin
cnt<=6'd0;
end
end
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) begin
rev<=1'b0;
end else if(wave_choise == 2'd2 && wave == 5'd20) begin
rev<=1'b0;
end else if(wave_choise == 2'd2 && wave == 5'd0) begin
rev<=1'b1;
end
end
always @(posedge clk or negedge rst_n)
begin
if(!rst_n) begin
wave <=5'd0;
end else if(wave_choise == 2'd0) begin
if (cnt == 6'd9) begin
wave <=5'd20;
end else if (cnt == 6'd19) begin
wave <=5'd0;
end
end else if(wave_choise == 2'd1) begin
if (wave == 5'd20) begin
wave <=5'd0;
end else begin
wave <= wave + 1'b1;
end
end else if(wave_choise == 2'd2) begin
if (rev == 1'b1) begin
if (wave == 5'd20) begin
wave <= wave - 1'b1;
end else begin
wave <= wave + 1'b1;
end
end else if (rev == 1'b0) begin
if (wave == 5'd0) begin
wave <= wave + 1'b1;
end else begin
wave <= wave - 1'b1;
end
end
end
end
endmodule
`timescale 1ns/1ns
module test_tb;
reg clk;
reg rst_n;
reg [1:0] wave_choise;
wire [4:0]wave;
// 实例化被测试模块
signal_generator uut (
.clk(clk),
.rst_n(rst_n),
.wave_choise(wave_choise),
.wave(wave)
);
// 生成时钟信号
initial begin
clk = 0;
forever #5 clk = ~clk; // 10ns 周期的时钟
end
// 测试过程
initial begin
// 初始化
rst_n = 0;
wave_choise = 0;
#20;
rst_n = 1;
#200
wave_choise = 1; #200
wave_choise = 2; #400
wave_choise = 0; #200
wave_choise = 2; #400
wave_choise = 1; #200
wave_choise = 0; #100
wave_choise = 1; #100
wave_choise = 2; #200
wave_choise = 0; #100
wave_choise = 2; #200
wave_choise = 1; #100
wave_choise = 0; #150
wave_choise = 1; #150
wave_choise = 2; #150
wave_choise = 0; #150
wave_choise = 2; #150
wave_choise = 1; #150
wave_choise = 0;
// 结束仿真
#150 $finish;
end
endmodule
查看14道真题和解析