hls ask 调制

平滑滤波器的设计与实现(FIR)
h(n):相当于平滑系数,
采样率:相当于采样时钟,就是驱动查找其幅值的时钟
载波频率:正弦波的周期是多少,
每个采样周期采样点: 采样率 / 载波频率
数据速率定义:已载波为载体的数据bit变化率,比如10个载波的周期是1个数据bit,那么bit率是载波频率的1/12.5
这次我们用C++编写了一个模拟ask调制。
本次设计中采样时钟使用 40MHz,数据频率 100KHz,载波频率 1.25MHz。既在 40MHz 的时钟下,每个载波周期内有 40MHz/1.25MHz = 32 个采样点;
该模块设计思路是先内部声明两个数组,分别存放sin和cos波形对应的值;
模块内部有一个计数器,在 40MHz 时钟作用下,从 0 到 32 进行循环计数;模块每输入一个数,进行一次判断,当输入数据为 0 时,输出为 0,当输入数据为 1时,输出 sin 与 cos 数组里与当前计数器对应的值每个数据周期里有 40MHz / 100KHz = 400 个采样点;
首先产生一个波形,我们依旧是是利用matlab 先模拟出波形,然后取点,将值保存下来,到时直接赋值给对应的数组。
由于根据我们前面的计算,我们每个载波周期需要32个采样点,所以我们在matlab 中生成将一个周期内取32点,并且将数数值保存下来,又因为标准的正弦信号的幅值范围是-1到+1,所以我们的数据可以乘以255(9位)然后再保存下来,到时只需要赋值给我们的对应的数组就行了。其中,由于在乘积的时候,最后有小数,所以我们利用matlab中的round函数进行四舍五入取整,保存才来。

matlab程序

clc;
clear all;
t = 0:1/32:31/32;
y1 = 255*sin(2*pi*t);
y2 = 255*cos(2*pi*t);
y1 = round(y1); %进行四舍五入
y2 = round(y2);
file = fopen('ram.txt','w+');
fprintf(file,'%d ,',y1);
fprintf(file,'\r\n');
fprintf(file,'%d ,',y2);
figure(1);
subplot(2,1,1);plot(t,y1);
subplot(2,1,2);plot(t,y2);
fclose(file);


其中关于HLS中的程序。
首先我们是用任意精度数据类型来定义我们的数据或者变量,ask 即就是当的需要调制的值是1时,输出其波形,输入数据为 0 时,输出为 0,当输入数据为 1时,输出 sin 与 cos。
这是我们需要的程序。其中这个程序已经是约束过后的程序,我们选择的约束的方式是AXI_stream,#pragma HLS RESOURCE variable=sin_table core=ROM_1P_BRAM latency=1 这是将这个设置为block rom, latency 都是设置为1,。

#include "ap_int.h"
#include"tx.ask.h"
void tx_ask(ap_uint <1> data_in, ap_int<16> *sin,ap_int<16> *cos){
#pragma HLS PIPELINE II=1
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS INTERFACE axis register both port=cos
#pragma HLS INTERFACE axis register both port=sin
#pragma HLS INTERFACE axis register both port=data_in
	static ap_int<8> count;  //函数入口就定义,不然会出错,申请一块内存,

	ap_int<16> sin_table[32] = {0 ,50 ,98 ,142 ,180 ,212 ,236 ,250 ,255 ,250 ,236 ,212 ,180 ,142 ,98 ,50 ,0 ,-50 ,-98 ,-142 ,-180 ,-212 ,-236 ,-250 ,-255 ,-250 ,-236 ,-212 ,-180 ,-142 ,-98 ,-50};
#pragma HLS RESOURCE variable=sin_table core=ROM_1P_BRAM latency=1
	ap_int<16> cos_table[32] = {255 ,250 ,236 ,212 ,180 ,142 ,98 ,50 ,0 ,-50 ,-98 ,-142 ,-180 ,-212 ,-236 ,-250 ,-255 ,-250 ,-236 ,-212 ,-180 ,-142 ,-98 ,-50 ,0 ,50 ,98 ,142 ,180 ,212 ,236 ,250};
#pragma HLS RESOURCE variable=cos_table core=ROM_1P_BRAM latency=1
	if(data_in  == 1){
		*sin = sin_table[count.range(4,0)]; //由于一个周期只有32个数,所以相当于二进制只用了5位,所以,只用count的5位
		*cos = cos_table[count.range(4,0)];

	}
	else{
		*sin = 0;
		*cos = 0;
	}
	count ++;
	if(count == 32) {
		count = 0;
	}

}

我们将程序写完后,再写了一个testbeech, 测试效果如何。下面是测试文件,测试代码我们的思路与Verilog一致,就是我们要提供 一个激励,然后进行测试就可以了。测试代码如下

#include"tx.ask.h"
int main(){

	ap_int<1> random_bits[64] = {1, 0, 1, 1, 0, 0, 1 ,1,
								 1, 0, 1, 1, 0, 0, 1 ,1,
								 1, 0, 1, 1, 0, 0, 1 ,1,
								 1, 0, 1, 1, 0, 0, 1 ,1,
								 1, 0, 1, 1, 0, 0, 1 ,1,
								 1, 0, 1, 1, 0, 0, 1 ,1,
								 1, 0, 1, 1, 0, 0, 1 ,1,
								 1, 0, 1, 1, 0, 0, 1 ,1};
	ap_int<16> cos,sin;
	for(int i  = 0; i < 64 *400 ; i++){
		tx_ask(random_bits[i / 400],&sin,&cos);

	}
	return 0 ;
}

然后我们可以进行RTL,联合仿真查看波形,

 上图中可以看出其满足ASK调制,下图我们将波形放大之后,可以看出其输出的波形是正弦与余弦(相差π/2)

 说明:本人写此博客只是为了记录自己跟着尤老师学习关于通信ic 的课程,若本人写的内容有误,欢迎各位指出

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值