惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
V
V2EX
博客园 - 【当耐特】
Vercel News
Vercel News
雷峰网
雷峰网
爱范儿
爱范儿
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Microsoft Azure Blog
Microsoft Azure Blog
F
Full Disclosure
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
NISL@THU
NISL@THU
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Attack and Defense Labs
Attack and Defense Labs
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Microsoft Security Blog
Microsoft Security Blog
腾讯CDC
P
Proofpoint News Feed
B
Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
K
Kaspersky official blog
I
InfoQ
Google Online Security Blog
Google Online Security Blog
L
LINUX DO - 最新话题
Project Zero
Project Zero
Engineering at Meta
Engineering at Meta
V
Visual Studio Blog
AI
AI
Schneier on Security
Schneier on Security
B
Blog RSS Feed
T
Tor Project blog
H
Help Net Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
C
Cyber Attacks, Cyber Crime and Cyber Security
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
V2EX - 技术
V2EX - 技术
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
Arctic Wolf
Webroot Blog
Webroot Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main

博客园 - Radiumlrb

接地不是“都连在一起”那么简单:从基础接地到相位噪声时钟与 DAC 的 AGND 设计 系统工程入门指南 7 Series FPGAs Memory Resources User Guide (UG473) ug471 7 Series FPGAs SelectIO Resources User Guide ds180 7 Series FPGAs Data Sheet: Overview Xilinx文档编号及其内容索引 提前还商业贷款计算python程序 示波器波形重建与正弦内插 DDR、PCIe、GTX等常见IP的配置解析 FPGA DFT/FFT AXI总线掩码(WSTRB)操作 GT高速收发器 杂谈 FPGA时序约束步骤(vivado) 常用时序收敛方法 FPGA原语及IDDR仿真 Vivado Design Suite 7 Series FPGA and Zynq 7000 SoC Libraries Guide (UG953) keep_hierarchy约束在三模冗余中的应用 Microsemi Libero SoC使用教程(胎教级 免费)(创建工程、引脚分配、仿真、逻辑分析仪ILA) Libero SoC 如何导入模块Module FPGA直方图均衡化 链接.so动态库
信号加扰与FPGA实现
Radiumlrb · 2024-07-05 · via 博客园 - Radiumlrb

加扰有利于数据传输的可靠性和保密性。

目的

  1. 减少连续的0或1:在数据传输中,长时间的连续0或1可能会导致时钟恢复困难和传输错误。加扰可以打破这些连续的比特,确保时钟信号能够正确恢复和同步。
  2. 改善频谱特性:加扰能够使信号的频谱特性更加平滑,减少特定频率成分的突发,从而减少对特定频段的干扰,提高信号的传输质量。
  3. 保密:在某些应用中,加扰还可以起到简单的数据保密作用,防止未授权的解读。

原理

加扰器的工作原理通常基于以下几种方法:

  1. 线性反馈移位寄存器 (LFSR):这是最常用的加扰方法之一,利用移位寄存器和反馈逻辑生成伪随机序列,与输入数据进行异或操作来扰乱数据。
  2. 异或操作 (XOR):通过将输入数据与伪随机序列进行逐位异或操作,改变输入数据的比特模式。
  3. 简单翻转 (Toggle):通过简单地翻转状态位来实现扰乱。

对于1bit的信号如图所示,在传输过程中使用scrambled_data进行传输,可以有效避免未授权的访问

对于多bit的信号

常用的多位加扰方法:

  1. 线性反馈移位寄存器 (LFSR):LFSR 是一种常见且有效的多位加扰方法。它利用移位寄存器和反馈逻辑生成伪随机序列,然后将输入数据与此伪随机序列进行逐位异或操作

  2. 加法混合:加法混合方法通过对输入数据进行加法操作(通常是模2加法,即异或操作),使用不同的加扰密钥或者伪随机序列来扰乱数据。

  3. 复杂的非线性算法:一些高级加扰方法可能采用复杂的非线性算法,如分组密码或者块加密算法。对于非线性加扰,一个例子如下,该例子使用多项式$x ^ { 4 } + x + 1$来对32bit的传输信号加扰

module scrambler_x4_x1_32bit(
    input wire clk,           
    input wire rst,           
    input wire [31:0] data_in, 
    output reg [31:0] data_out 
);

reg [31:0] state; 

always @(posedge clk or posedge rst) begin
    if (rst) begin
        state <= 32'b0000_0000_0000_0000_0000_0000_0000_0001; // 初始化状态,任意非零初始状态均可
    end else begin
        state <= {state[30:0], state[31] ^ state[0] ^ data_in}; 
    end
end

assign data_out = data_in ^ state[0];

endmodule

64bit仿真代码

对加扰仿真,输出结果符合预期

仿真代码如下

module scrambler_64bit(
    input wire clk,
    input wire rst,
    input wire [63:0] data_in,
    output reg [63:0] data_out
);

reg [63:0] state;

always @(posedge clk or posedge rst) begin
    if (rst) begin
        state <= 64'hFFFFFFFFFFFFFFFF; 
    end else begin
        state <= state + 64'hAAAAAAAAAAAAAAAA; // 64位加法扰乱器
    end
end

assign data_out = data_in ^ state; // 异或

endmodule
module descrambler_64bit(
    input wire clk,
    input wire rst,
    input wire [63:0] data_in,
    output reg [63:0] data_out
);

reg [63:0] state;

always @(posedge clk or posedge rst) begin
    if (rst) begin
        state <= 64'hFFFFFFFFFFFFFFFF; // 初始化,需与加扰器一致
    end else begin
        state <= state + 64'hAAAAAAAAAAAAAAAA; // 解扰器状态更新,需与加扰器保持同步
    end
end

assign data_out = data_in ^ state; // 异或恢复原始数据

endmodule
module tb_scrambler_descrambler_64bit();

reg clk;
reg rst;
reg [63:0] data_in;
wire [63:0] scrambled_data;
wire [63:0] descrambled_data;

scrambler_64bit scrambler_inst (
    .clk(clk),
    .rst(rst),
    .data_in(data_in),
    .data_out(scrambled_data)
);

descrambler_64bit descrambler_inst (
    .clk(clk),
    .rst(rst),
    .data_in(scrambled_data),
    .data_out(descrambled_data)
);

// Clock generation
always #5 clk = ~clk;

initial begin
    clk = 0;
    rst = 1;
    data_in = 64'h12340000ABCD0000; 
    #10 rst = 0; 
    #100;
    $display("Input Data: %h", data_in);
    $display("Scrambled Data: %h", scrambled_data);
    $display("Descrambled Data: %h", descrambled_data);
    // $finish;
end

endmodule