弄的蛋都碎了阿。。。
先上代码:
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,2: begin
if(addr==15) quad = quad+1;
else addr = addr+1;
end
1,3: begin
if(addr==0) quad = quad+1;
else addr = addr-1;
end
endcase
end
end
assign dout = (quad[1])? (1024-d):(1024+d);
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,2: begin
if(addr==15) quad = quad+1;
else addr = addr+1;
end
1,3: begin
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];
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