--> --> >-->

Hello World!

  • Hello World!

  • Hello World!

  • Hello World!

  • Hello World!

  • Hello World!

  • Hello World!

  • Hello World!

  • Hello World!

  • Hello World!

移植FreeRTOS到我的SoC(一)基本移植

硬件准备 一、实现一个mtime外设作为RISC-V标准机器定时器中断源 src/rtl/peripheral/mtime_mmio.sv `include "../lib/soc_pkg.sv" `include "../lib/bus_if.sv" module mtime_mmio ( input logic clk, input logic rst_n, output logic timer_irq, simple_bus_if.slave bus ); import soc_pkg::*; logic sel_mtime_lo, sel_mtime_hi, sel_mtimecmp_lo, sel_mtimecmp_hi; always_comb begin sel_mtime_lo = (align_word(bus.addr) == IO_MTIME_LO_ADDR); sel_mtime_hi = (align_word(bus.addr) == IO_MTIME_HI_ADDR); sel_mtimecmp_lo = (align_word(bus.addr) == IO_MTIMECMP_LO_ADDR); sel_mtimecmp_hi = (align_word(bus.addr) == IO_MTIMECMP_HI_ADDR); end logic [63:0] mtime; logic [63:0] mtimecmp; always_ff @(posedge clk or negedge rst_n) begin if (!rst_n) begin mtime <= 64'd0; mtimecmp <= 64'hFFFF_FFFF_FFFF_FFFF; end else begin mtime <= mtime + 64'd1; if (bus....

March 25, 2026 · 5 min

tmux笔记

前言 tmux(Terminal Multiplexer)是一款功能强大的终端复用器。简单来说,它能让你在同一个屏幕上管理多个终端会话。除非手动终止tmux session,否则它会在SSH断开连接后继续运行。 安装 sudo apt install tmux -y 基本操作 Session操作 tmux # 创建新Session并进入 tmux new -s <name> # 创建具有名称 tmux rename-session <session name> <new name> # 更名session tmux ls # 查看正在运行的ession tmux attach -t <session name> # 重连seesion tmux kill-session -t <session name> # 使后台session停止活动 视窗操作 Ctrl+B D — 断开当前session Ctrl+B % — 水平分割视窗 Ctrl+B “ — 垂直分割视窗 Ctrl+B 方向键 — 在视窗之间移动 Ctrl+B X — 关闭当前视窗 Ctrl+B C — 创建新视窗 Ctrl+B N or P — 在前/后一个视窗切换 Ctrl+B Q — 按下后再点击每个视窗上显示的数字对应按键即可跳转到视窗 Ctrl+B : — 输入指令 Ctrl+B ?...

December 25, 2025 · 2 min

数字滤波器笔记(三)基于高云的FIR滤波器

系统概述 系统时钟为24MHz,使用高云GW2A FPGA从AD9280读取数据后经过一个FIFO作为缓冲,经FIR滤波器处理之后使用AD9708输出。AD9280与AD9708都使用八位并口传输数据。FIFO与FIR滤波器使用高云IP核。FIR滤波器系数使用Matlab的FDATOOL生成。 滤波器系数生成 导出时选择导出为C头文件,这样系数是有符号十进制数。将这些系数复制到一个文本文件中,一行一个系数,不要有其他符号。 IP核生成 选择’Advanced FIR Filter’IP核。 我在上一个步骤中生成的FIR系数是偶对称、偶整数,具有50个抽头系数,为14位量化。因此’FIR Type’选择’fir symmetry’以节省硬件资源。下方的’Coefficient File’选择上一步骤中的文本文件。 FIFO我选择了异步FIFO,为以后的拓展留下空间。 代码 module top ( input clk, input rst_n, output da_clk, output reg [7:0] da_data, output ad_clk, input [7:0] ad_data ); assign ad_clk = clk24m; assign da_clk = clk24m; wire fir_valid_out; wire fir_sync_out; wire [20:0] fir_data_out; wire signed [7:0] signed_fifo_dout; assign signed_fifo_dout = fifo_dout - 8'd128; Advanced_FIR_Filter_Top u_fir( .clk(clk24m), //input clk .rstn(rst_n), //input rstn .fir_rfi_o(), //output fir_rfi_o ....

June 7, 2025 · 1 min

数字滤波器笔记(二)FIR滤波器的Matlab设计

线性相位系统的物理意义 考虑一个具有线性相位的理想低通滤波器,其频率响应定义如下: $$ H_{lp}=\begin{cases}e^{-j\omega n_d},&|\omega|\leq\omega_c\\0,& \omega_c\leq|\omega|\leq\pi\end{cases} $$ 对其进行离散傅里叶逆变换,得到它的单位脉冲响应: $$ h_{\text{lp}}(n) = \frac{1}{2\pi}\int_{-\omega_{\text{c}}}^{\omega_{\text{c}}} e^{-j\omega n_{\text{d}}} e^{j\omega n} \,d\omega = \frac{\sin\omega_{\text{c}}(n-n_{\text{d}})}{\pi(n-n_{\text{d}})},\quad -\infty < n < \infty $$ 而一个理想的低通滤波器的单位脉冲响应为: $$ \frac{\sin\omega_\text{c}n}{\pi n},\quad-\infty< n <\infty $$ 可以看出具有线性相位的低通滤波器与零相位的理想低通滤波器的差别只是出现了延时。线性相位的滤波器可以保证信号通过系统后,各种频率成分之间的相对相位关系保持不变。 通常用群延迟$τ(ω)$表征相位的线性: $$ \tau(\omega)=\mathrm{grd}[H(\mathrm{e}^{\mathrm{j}\omega})]=-\frac{\mathrm{d}}{\mathrm{d}\omega}\left\{\mathrm{arg}[H(\mathrm{e}^{\mathrm{j}\omega})]\right\} $$ 一个线性相位的系统,它的群延迟应该是一个常数。 FIR滤波器 原理 $$ H(z)=\sum_{n=0}^{N-1}h(n)z^{-n}=h(0)+h(1)z^{-1}+\cdots+h(N-1)z^{-(N-1)} $$ 从系统函数可以看出,FIR滤波器只在原点上有极点,这使得FIR系统具有全局稳定性。FIR滤波器的结构也被称为抽头延迟线结构。 延迟线(Delay Line): 指的是用来存储输入信号 $x(n)$ 及其过去的 $N−1$ 个样本的结构。这些样本分别是 $x(n),x(n−1),x(n−2),…,x(n−(N−1))$。这通常通过一系列延迟单元(例如,Z⁻¹ 单元,表示一个单位延迟)来实现。 抽头(Tap): 指的是从延迟线上的每一个延迟单元的输出端“抽取”出一个信号。每个抽头都对应输入信号的一个特定延迟版本(例如,$x(n), x(n−1),$ 等等)。 乘法器(Multipliers): 每个从延迟线“抽”出来的信号($x(n−k$))都会与相应的滤波器系数 h(k) 进行相乘。这些滤波器系数就是 FIR 滤波器的单位取样响应的数值。 加法器(Summing / Adder): 所有这些乘法器($h(k)x(n−k)$)的输出会被汇集起来,通过一个加法器进行求和,从而得到最终的输出 $y(n)$。 特性 相位特性 并非所有FIR滤波器都具有严格的线性相位特性。只有当单位脉冲响应$h(n)$满足对称条件时,FIR滤波器才具有线性相位特性。...

May 31, 2025 · 1 min

CS61C笔记

前言 CS61C的笔记。以下描述的所有内容基于RV32(RISC-V的32位变体)。 CS61C的视频:Youtube 寄存器 RISC-V中有32个寄存器,每个寄存器的位宽为32。命名为x0-x31,其中x0永远存储0值(通过硬连线到地)。其中x10-x17又被命名为a0-a7,作为函数调用的参数寄存器。 汇编 关于RISC-V指令我发现一个很实用的项目,他将RV32I的指令和汇编伪指令做成了tldr库。安装后可以方便的查询指令的用法。 加减法 add 加法。 示例: add x1,x2,x3 (in RISC-V) 等同于:a = b + c (in C) sub 减法。 示例:sub x3,x4,x5 (in RISC-V) 等同于:d = e - f (in C) addi 立即数加法。 示例:addi x3,x4,10 (in RISC-V) 等同于: f = g + 10 (in C) 不存在立即数减法指令,将立即数设置为负数即可实现减法。 它可以用内存操作指令配合加法指令来替代,但我们仍然需要它。因为立即数加法非常常用。 内存操作 内存 内存按照字(words,4 bytes = 1 words)组织。数据遵循小端模式,高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。 lw 从内存读取一个字到寄存器。 示例: int A[100]; g = h + A[3]; lw x10, 12(x15) add x11, x12, x10 其中x15表示A所在的地址,12(字节)为偏移量。由于内存按照字(4字节)组织,故A[3]便是由A的地址偏移3个字得到的。偏移量必须是4的倍数。...

May 10, 2025 · 5 min