用Verilog HDL写了个sine wave generator

弄的蛋都碎了阿。。。

先上代码:

sine.v 

module sine (clk, nrst, dout);
    input       clk,            // clock input
                nrst;           // active-low reset
    output[10:0]        dout;           // 10-bit output

    reg[3:0]    addr;           // ROM address
    reg[1:0]    quad;           // Quadrant count

    wire[9:0]   d;              // read data from ROM

    rom16x10    rom(.addr(addr), .data(d));

    always @(posedge clk or negedge nrst) begin
        if(!nrst) begin
            quad = 0;
            addr = 0;
        end
        else begin
            case (quad)
                0,2begin
                    if(addr==15) quad = quad+1;
                    else addr = addr+1;
                end
                1,3begin
                    if(addr==0) quad = quad+1;
                    else addr = addr-1;
                end
            endcase
        end
    end

    assign dout = (quad[1])? (1024-d):(1024+d);

endmodule  


 

rom.v

module rom8x10 (addr, data);
    input[3:0]  addr;           // address input
    output[9:0] data;           // data output

    reg[9:0]            rom[0:15];               // memory variable

    initial     $readmemh("rom.dat",rom);

    assign      data = rom[addr];

endmodule  


 

过程其实比较简单,一个周期分成4部分来画,第一个四分之一周期0-1024,第二个四分之一周期1024-0,继续循环;每个周期64个采样点。

蛋疼的是要算这个采样点的值阿,我手闲阿,用计算器都比这快有木有。。。

我用lua算的:

for i=0,16 do print(1024*math.sin(math.rad(i*5.2))) end

lua好久没用不怎么会用了。。。这一句憋了好久。。。

算出来之后再把数值转成16进制。。。转的想哭。

=======bug1====== 

写完上面这些,发现90/16,应该是5.6的样子- -|||,算错了,重来。

=======bug2======

要做的是10位的输出,1024+1024溢出鸟。。。改成512的再算一遍。 

=======纯粹是蛋疼===

验证硬件,又不是干嘛用,完全不用管效率的嘛,直接这样不是更省事?

for i=0,64 do print(512*(1+math.sin(math.rad(i*5.62)))) end 

 

 

posted @ 2012-03-21 19:05  Biiigfish  阅读(1997)  评论(0编辑  收藏  举报