用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 

用Verilog HDL写了个sine wave generator 

 

你可能感兴趣的:(generator)