跳到主要内容

3.5 主要代码片段及说明

OLED屏幕上的参数显示

OLED模块代码基于硬禾学堂网站的代码。主要利用了其中MAIN函数显示字母的功能,进行了一系列的修改。首先需要注意的是每个字符串的单个ASCII字符都是用8位二进制数表示的,所以传入其中的数值需要将每个数字都编码成8位BCD码的形式。

5'd8:   
begin y_p <= 8'hb7;
x_ph <= 8'h10;
x_pl <= 8'h00;
num <= 5'd16;
char <= {"Amplitude ", disp_amptitude[8*2-1:8], ".", disp_amptitude[7:0]," V"};
state <= SCAN;
end

OLED屏幕上的波形形状显示

波形显示同样是通过MAIN函数中的ASCII打印方式。将正弦波和矩形波等图案的8*5点阵信息增加到ASCII查找表的末尾,即可通过对应数值表示该图案。每个波形图案都是由两个字符位组成。

case(wave_type)
2'd0: char <= {"Waveform ", 8'd123, 8'd124, " "}; // sin
2'd1: char <= {"Waveform ", 8'd125, 8'd126, " "}; // square
2'd2: char <= {"Waveform ", "/", 8'd127, " "}; // triangle
default: char <= {"Waveform ", "--", " "}; // direct
endcase

多步进的频率调节

这里的frequency使用了用于oled显示的编码形式,也就是以十进制显示的每个数字都编码为8位BCD码,当调节每个数字的大小使用下面的代码凭借步进状态的不同就可以实现不同的增加量。

if (frequency[frequency_step_state*8 +: 8] < 9) begin
frequency[frequency_step_state*8 +: 8] = frequency[frequency_step_state*8 +: 8] + 1;
end

正弦波的查找表

以下模块借鉴了Chores的博客,在其基础上修改。

实现正弦输出需要使用累加器寻址然后配合使用正弦函数查找表,下面显示了正弦波具有对称性的四个状态,可以节约查找表使用的存储大小。

       case(section)
2'b00: begin
lut_address = address[5:0];
cos = 9'h1ff + lut_cos;
end
2'b01: begin
lut_address = ~address[5:0];
cos = 9'h1ff + lut_cos;
end
2'b10: begin
lut_address = address[5:0];
cos = 9'h1ff - lut_cos;
end
2'b11: begin
lut_address = ~address[5:0];
cos = 9'h1ff - lut_cos;
end
endcase

其他波形的相位函数

对于矩形波和三角波,他们的波形和相位之间的函数关系简单,可以通过表达式来完成。

//Code below is designed to generate Square wave
assign square_dac = {10{dds_phase[27]}};
//Code below is designed to generate Trig wave
assign trig_dac = dds_phase[27] ? ~dds_phase[26:17] : dds_phase[26:17];
//Code below is designed to generate Saw wave
assign dc_dac = 28'd0 - 1'd1;
// assign dc_dac = dds_phase[27:18];

光标和步进显示灯

简单的实现了显示当前光标状态和频率步进值的功能。

assign logs = ~(8'd1 << frequency_step_state);
assign led2 = cursor_state? 3'd111: 3'd110;
assign led1 = cursor_state? 3'd110: 3'd111;

资源占用情况

Design Summary:
Number of registers: 387 out of 4635 (8%)
PFU registers: 387 out of 4320 (9%)
PIO registers: 0 out of 315 (0%)
Number of SLICEs: 1348 out of 2160 (62%)
SLICEs as Logic/ROM: 1348 out of 2160 (62%)
SLICEs as RAM: 0 out of 1620 (0%)
SLICEs as Carry: 415 out of 2160 (19%)
Number of LUT4s: 2527 out of 4320 (58%)
Number used as logic LUTs: 1697
Number used as distributed RAM: 0
Number used as ripple logic: 830
Number used as shift registers: 0
Number of PIO sites used: 36 + 4(JTAG) out of 105 (38%)
Number of block RAMs: 0 out of 10 (0%)
Number of GSRs: 1 out of 1 (100%)
EFB used : No
JTAG used : No
Readback used : No
Oscillator used : No
Startup used : No
POR : On
Bandgap : On
Number of Power Controller: 0 out of 1 (0%)
Number of Dynamic Bank Controller (BCINRD): 0 out of 6 (0%)
Number of Dynamic Bank Controller (BCLVDSO): 0 out of 1 (0%)
Number of DCCA: 0 out of 8 (0%)
Number of DCMA: 0 out of 2 (0%)
Number of PLLs: 1 out of 2 (50%)
Number of DQSDLLs: 0 out of 2 (0%)
Number of CLKDIVC: 0 out of 4 (0%)
Number of ECLKSYNCA: 0 out of 4 (0%)
Number of ECLKBRIDGECS: 0 out of 2 (0%)