当前位置: 首页 > news >正文

基于FPGA通原第二天(1)

在数字通信、软件无线电(SDR)中,BPSK(二进制相移键控)是最基础、最经典的数字调制方式。它用 0° 和 180° 两个相位的正弦载波,分别表示二进制 0 和 1,抗噪性能强、实现简单。

本文就基于一段可直接综合、可仿真运行的 Verilog 代码,从零讲透:数字 BPSK 到底怎么实现?代码每一行在干什么?背后原理是什么?


一、BPSK 概念

一句话:用载波相位表示数字信息

  • 发送0→ 输出正常正弦波(相位 0°)
  • 发送1→ 输出反转正弦波(相位 180°)

数学上:

  • 0 对应:\(s_0(t) = \sin(\omega t)\)
  • 1 对应:\(s_1(t) = -\sin(\omega t) = \sin(\omega t+\pi)\)

在数字电路里,我们不用复杂的相位计算,直接对正弦波采样值取反,就完成了 180° 相移 —— 这也是这份代码最巧妙的地方。


二、DDS 载波 + BPSK 调制

这份代码只有一个模块,完成两件核心事:

  1. DDS(直接数字频率合成):生成稳定的正弦载波
  2. BPSK 调制:根据输入比特,输出原波 / 反相波

整体信号流:输入比特 data_in相位判断(0/1)DDS 生成正弦原波/取反输出调制波形 bpsk_out


三、逐行拆解 Verilog 代码

1. 模块端口定义

verilog

module bpsk_modulator( input wire clk, // 系统时钟 input wire rst_n, // 低电平复位 input wire data_in, // 基带比特流(0/1) input wire [31:0] fcw, // 频率控制字(控制载波频率) output reg signed [7:0] bpsk_out // BPSK调制输出(8位有符号) );
  • fcw:频率控制字,决定载波频率,改它就能改频
  • bpsk_out:8 位有符号数,直接送给 DAC 就能出模拟波形

2. DDS 核心:相位累加器

verilog

reg [31:0] phase_acc; always @(posedge clk or negedge rst_n) begin if (!rst_n) phase_acc <= 32'd0; else phase_acc <= phase_acc + fcw; end
  • 每来一个时钟,相位就 +fcw
  • 32 位寄存器不断累加,相当于数字角度旋转器
  • 频率公式:越大,载波频率越高。

3. 正弦波查找表(LUT)

verilog

wire [7:0] addr = phase_acc[31:24]; reg signed [7:0] sin_lut [0:255]; initial begin $readmemh("sin_lut_one.hex", sin_lut); end assign sin_out = sin_lut[phase_acc[31:24]];
  • 相位高 8 位作为地址(0~255),刚好对应一个完整正弦周期
  • 从 ROM 里读出预存的正弦采样值
  • 不用乘法器,纯查表,速度快、省资源

4. BPSK 调制:最关键一行逻辑

verilog

always @(posedge clk or negedge rst_n) begin if(!rst_n) bpsk_out <= 8'sd0; else if(data_in) bpsk_out <= -sin_out; // 1 → 反相 else bpsk_out <= sin_out; // 0 → 原相 end
  • data_in = 0:直接输出正弦
  • data_in = 1:正弦值取反(= 180° 相移)
  • 这就是数字 BPSK 的最简实现

仿真代码和结果

`timescale 1ns/1ps module tb_bpsk_modulator(); reg clk ; reg rst_n ; reg data_in ; reg [31:0] fcw ; wire [7:0] bpsk_out ; bpsk_modulator u_bps_modulator( .clk (clk ), .rst_n (rst_n ), .fcw (fcw ), .data_in (data_in ), .bpsk_out (bpsk_out) ); initial begin clk = 0 ; forever begin #5 clk = ~clk; end end initial begin rst_n = 0; fcw = 32'd429496730; #100 rst_n = 1; data_in = 0; #100 data_in = 1; #100 data_in = 1; #100 data_in = 1; #100 data_in = 0; #100 data_in = 0; #100 data_in = 1; #100 data_in = 0; #100 data_in = 1; #100 data_in = 0; #100 data_in = 0; #100 data_in = 0; #100 data_in = 1; #100 rst_n = 1; data_in = 0; #100 data_in = 1; #100 data_in = 1; #100 data_in = 1; #100 data_in = 0; #100 data_in = 0; #100 data_in = 1; #100 data_in = 0; #100 data_in = 1; #100 data_in = 0; #100 data_in = 0; #100 data_in = 0; #100 data_in = 1; #100 rst_n = 1; data_in = 0; #100 data_in = 1; #100 data_in = 1; #100 data_in = 1; #100 data_in = 0; #100 data_in = 0; #100 data_in = 1; #100 data_in = 0; #100 data_in = 1; #100 data_in = 0; #100 data_in = 0; #100 data_in = 0; #100 data_in = 1; #100 rst_n = 1; data_in = 0; #100 data_in = 1; #100 data_in = 1; #100 data_in = 1; #100 data_in = 0; #100 data_in = 0; #100 data_in = 1; #100 data_in = 0; #100 data_in = 1; #100 data_in = 0; #100 data_in = 0; #100 data_in = 0; #100 data_in = 1; #100 rst_n = 1; data_in = 0; #100 data_in = 1; #100 data_in = 1; #100 data_in = 1; #100 data_in = 0; #100 data_in = 0; #100 data_in = 1; #100 data_in = 0; #100 data_in = 1; #100 data_in = 0; #100 data_in = 0; #100 data_in = 0; #100 data_in = 1; #100 rst_n = 1; data_in = 0; #100 data_in = 1; #100 data_in = 1; #100 data_in = 1; #100 data_in = 0; #100 data_in = 0; #100 data_in = 1; #100 data_in = 0; #100 data_in = 1; #100 data_in = 0; #100 data_in = 0; #100 data_in = 0; #100 data_in = 1; #5000 $finish; end endmodule

设定系统时钟 100MHz、频率控制字 FCW=429496730 完成波形仿真,对比可见输入基带比特 0、1 对应的两路载波相位区分清晰,调制波形规整理想。

http://www.jsqmd.com/news/1152667/

相关文章:

  • 自动售货机装上“眼睛“后,损耗直接降了一半~YH
  • MarkText架构设计:高性能Markdown编辑器的5大核心技术优化
  • Claude Code × DeepSeek双模型协同开发架构(企业级LLM接入黄金标准已发布)
  • 3分钟掌握FlyOOBE:让老旧电脑畅享Windows 11的智能助手
  • webporter:Java 爬虫的实操样本
  • SketchUp 报错 “新版本创建”?SKP 版本转换器极简教程
  • 2026知识付费小程序:年费全包零抽成,录播题库全功能覆盖
  • BilibiliDown:专业高效的跨平台B站视频下载解决方案
  • FlyOOBE:让老旧电脑也能轻松升级Windows 11的智能助手
  • 本地AI编程环境搭建:Codex部署与DeepSeek API接入实战指南
  • 从零构建本地AI智能体:Hermes Agent部署、定制与实战指南
  • Function Calling 不生效?参数总被忽略?ChatGPT v4.5函数调用失败全链路诊断手册,含12个真实报错日志还原
  • 5步掌握视频转3D动作捕捉:零成本创作专业动画的终极指南
  • 3款主流自动驾驶数据集对比:nuScenes vs Waymo vs Argoverse 2 数据规格与标注差异
  • 如何快速安装和使用Minecraft Advanced XRay模组:新手终极指南
  • ChatModel和ChatClient
  • 基于Spring Boot的茶叶信息展示与销售系统设计与实现
  • 微流控多孔基质荧光标记原料 AATOM 532 TCO,直观表征固相内生物分子扩散分布特征
  • Blender到UE5数字孪生实战:高精度建模、实时数据对接与性能优化全流程解析
  • 一文看懂 AdsPower 的浏览器指纹技术实现
  • 如何高效使用oee_archive:从目录结构到文件获取的完整指南 [特殊字符]
  • 软件测试入门——第二十八课(Linux系统环境搭建实战)
  • 手把手编写儿童手机远程监控App之webrtc建立通信后无法再分享音视频
  • AI Agent颠覆认知!告别简单问答,解锁“能办事”的数字同事时代!
  • ChatGPT o1的“思考时间”真能提升准确率? vs DeepSeek R1的零样本迁移能力——来自5家头部AIGC公司的AB测试原始数据
  • 当下你的门店靠什么竞争?
  • AIGC Agent技术架构解析:从任务规划到旅行Agent实战
  • 如何在Windows上高效部署Poppler:实用PDF处理工具配置指南
  • AI 电动搅拌机智能功率 高效率、快速响应 完整选型方案
  • 解决leetcode第3985题回文数组求和