数电课程设计——课设三:波形发生器

一、实验内容

1、仿真实验:正弦信号发生器,学习IP核的使用;

2、拓展要求:三角波信号发生器,熟悉仿真、状态机的使用。

  • 实验步骤

    跳过创建工程的过程。

(1)编写正弦波仿真实验代码

首先我们生成正弦波是提前把正弦波的数据保存在ROM文件(.mif)文件中,然后通过调用ROM的IP核,最后通过读取ROM的数据输出正弦波数据。

创建单端ROM的IP核。

设置ROM的位宽和长度。这里是8位64个信号

添加.mif文件

编写的.v顶层文件:

module waveform(
	input clk,
	input rst,
	output [7:0]data_out,
	output reg [6:0]data_tri
);
parameter S1 = 0;
parameter S2 = 1;
reg [5:0]addr;
reg [1:0]state;
reg [1:0]next_state;
always@(posedge clk or negedge rst)begin
if(!rst)
addr <= 0;
else
addr <= addr + 1;
end

sinROM U1(
	.address(addr),
	.clock(clk),
	.q(data_out));






endmodule

(2)编写三角波发生器仿真实验代码

编写的状态机源码:

//状态迁移  
always@(posedge clk or negedge rst)begin  
if(!rst)  
    state <= S1;  
else  
    state <= next_state;  
end  
  
//状态事件  
always@(posedge clk or negedge rst)begin  
if(!rst)  
    next_state <= 0;  
else begin  
    case(state)  
    S1: begin  
        if(data_tri >= 98)  
        next_state <= S2;  
        else  
        next_state <= state;  
    end  
    S2: begin  
        if(data_tri <= 2)  
        next_state <= S1;  
        else  
        next_state <= state;  
    end  
    default: next_state <= S1;  
  
    endcase  
end  
end  
  
always@(posedge clk or negedge rst)begin  
if(!rst)begin  
    data_tri <= 0;  
end  
else begin  
    case(state)   
    S1 : data_tri <= data_tri + 1;  
    S2 : data_tri <= data_tri - 1;  
    default: data_tri <= 0;  
    endcase  
end  
end  

编写的测试文件:

`timescale 1 ns/ 1 ps  
module waveform_tb();  
// constants                                             
// general purpose registers  
// test vector input registers  
reg clk;  
reg rst;  
// wires                                                 
wire [7:0]  data_out;  
wire [6:0]  data_tri;  
  
// assign statements (if any)                            
waveform i1 (  
// port map - connection between master ports and signals/registers     
    .clk(clk),  
    .data_out(data_out),  
    .data_tri(data_tri),  
    .rst(rst)  
);  
initial                                                  
begin                                                    
        clk = 0;  
        rst = 0;  
        #100 rst = 1;  
end                                                      
always   #10 clk <= ~clk;                                                
// optional sensitivity list                             
// @(event1 or event2 or .... eventn)                    
                                                 
endmodule  

三、实验结果

正弦波波形:

三角波波形:

注意事项:在正弦波形的仿真过程中遇到过读取ROM的数一直为零的情况,后来查询发现是因为.mif文件与工程不在同一目录。

本文大部分内容都属于原创,如需转载,请附上本文网站,
如果需要相关的仿真图、程序代码等资料可以直接私信我,我会及时回复。

你可能感兴趣的:(FPGA,课程设计,fpga开发)