实验需要用到若干个波形发生器,先做一个简易的模板用用,下面是大致的方法
实现数字频率为的正弦波发生器,直接上顶层函数代码:
void SinGenerator(
hls::stream<t_data> &strm_out
){
/* ROM初始化 */
t_data rom[N];
#pragma HLS BIND_STORAGE variable=rom type=rom_1p impl=bram
ROM_init(rom);
output:
for(int i = 0; i < N; i++)
{
#pragma HLS PIPELINE
strm_out.write(rom[i]);
}
}
关键是在于ROM的初始化,需要以单独的函数声明(直接在顶层函数里写赋值循环是不行的),HLS将通过编译指令自动推断出ROM,完成综合
#include "ap_int.h"
#include "hls_stream.h"
#define Q 18
#define N 2048
#define FREQ (2*M_PI/(N*1.0))
typedef ap_int<Q> t_data;
void ROM_init(
t_data rom[N]
)
{
for(int i = 0; i < N; i++)
{
double real_val = (pow(2, Q - 2))*sin(FREQ * i);
rom[i] = real_val;
}
}
仿真波形,
此外,可以用模块级控制协议ap_ctrl_hs和端口输出的满信号配合实现波形发生的启动/终止,如果保持ap_start置位且满信号无效,则模块将输出连续正弦波形。
资源使用:
注:当N过大的时候,编译器可能会无法推断出ROM,要解决这个问题只能将ROM的深度单独设置为与频率无关的参数,也就是说不能直接设为深度