弄的蛋都碎了阿。。。
先上代码:
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);
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