NanoPC-T4开发记录

前言 咸鱼200块淘了块RK3399的T4开发板(裸板),4GRAM,16GBemmc,比起树莓派,价格算很香的了 制作外壳 因为没有外壳,官方的外壳售价一言难尽,并且没有预留GPIO的空间,尝试自己画亚克力外壳。先是用了3DMAX,可惜商家需要dwg格式(即需要autoCAD),简单学习就能上手,需要学习rec,dli等命令的使用。同时经过测量需要M3的六角铜柱,以及M3螺丝,螺母,具体规格可以参考Raspberry-Pi/NanoPC-T4 at master · laningya/Raspberry-Pi (github.com) 烧录系统 常用的烧录方式有两种(直接将系统安装在SD卡,读写速度有点慢,且步骤相对简单,不作记录) 从windows或者linux烧录到emmc 从sd卡烧录到emmc 以上两种方式,官方文档都提供了详细的步骤。 主要记录在emmc中安装armbian系统 下载或自己编译Armbian的镜像文件。此处推荐内核版本为4.4或4.19,至于原因后续会讲到,如果不想编译,可以直接在官方提供的链接下载。 将镜像写入sd卡。windows平台下推荐使用win32Diskimage,linux平台下推荐使用dd命令,它看起来是这样 sudo dd if=imagePath of=/dev/sdx bs=4M status=progress 将Armbian系统写入到emmc中。Armbian提供了 armbian-config的工具,命令行执行: sudo armbian-config 依次选择System—>Install—>Boot from eMMC - system on eMMC 基本初始化 apt换源以及armbian换源 参考清华大学开源软件镜像站帮助文档 Debian apt换源参考文档 Armbian换源参考文档 ifconfig普通用户无法执行问题 vim ~/.bashrc #在文件末尾添加 export PATH=$PATH:/sbin:/usr/sbin #保存后命令行执行 source ~/.bashrc WiringPI for RK3399 安装 参考官方文档 说明: 官方的wiringpi for rk3399 的.deb文件通过解包可以发现,官方只为NanoPC-T4开发板适配了4.x内核,这也是为什么推荐安装4.4内核的armbian系统。 PWM风扇配置 rk3399真的太热了,只配置散热片的情况下,待机状态下,cpu温度都有40摄氏度,所以还是推荐购买官方的PWM风扇,12V供电且开发板预留了接口,有了散热风扇后,cpu35摄氏度左右,除了贵没啥缺点,。以下脚本也只支持4.x内核版本 class="wp-block-preformatted">#文件路径:/usr/bin #文件名称:start-rk3399-pwm-fan.sh #以下为文件内容: #!/bin/bash echo $$ > /var/run/fan.pid echo 0 > /sys/class/pwm/pwmchip1/export echo 0 > /sys/class/pwm/pwmchip1/pwm0/enable echo 50000 > /sys/class/pwm/pwmchip1/pwm0/period echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable while true do temp=$(cat /sys/class/thermal/thermal_zone0/temp) if [ $temp -gt 48000 ]; then echo 1000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle; elif [ $temp -gt 43000 ]; then echo 20000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle; elif [ $temp -gt 38000 ]; then echo 30000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle; elif [ $temp -gt 33000 ]; then echo 40000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle; else echo 50000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle; fi sleep 1s; done #文件路径:/lib/systemd/system #文件名称:pwm-fan.service #以下为文件内容 [Unit]Description=pwm-fan After=rc.local.service [Service] Type=oneshot KillMode=control-group WorkingDirectory=/tmp ExecStart=/usr/bin/start-rk3399-pwm-fan.sh [Install] WantedBy=multi-user.target Alias=pwm-fan.service 配置开机自启动 ...

May 27, 2023 · 2 min · laning

数字集成电路设计实验——FIR滤波器

1. 课程信息 ■实验地点:清水河校区KB239 ■ **实验时间:**2021.04.16 ■ **实验时长:**3小时(4节课) 2. 实验要求 1. The fir filter input sampling rate is 100kHz, the filter passband single-sideband bandwidth is 20kHz, the out-of-band suppression is 90dB, and the in-band ripple is 1dB. 2. The filter coefficient needs to be fixed-point, and the effective number of ADCs is 24bit. The filter coefficient bit width is self-defined. 思考(加分项): 1. The relationship between filter passband, stopband, out-of-band rejection and filter order ...

April 21, 2023 · 2 min · laning

数字集成电路设计实验——时钟

1. 课程信息 实验地点:清水河校区KB239 **实验时间:**2021.04.9 实验时长: 3小时(4节课) 2. 实验要求 驱动板上数码管显示当前时间(包含时、分、秒) ①建议定义n个按键,如用于功能切换 (tab)、校时+1(up)及确认(ok) ②整点报时: 7:00~23:00间每个整点蜂鸣器响1s 思考(加分项): 1. 如何添加闹钟功能? 2. 如何添加定时器功能? 3. 设计模N计数器的测试向量集,撰写testbench进行验证测试 3. 设计与实现 3.1 电路功能说明 (包括各个模块功能、关键代码分析,可以使用文字、框图、功能表、状态图等进行说明) 3.1.1 顶层设计 3.1.2 timing_module 接收PLL多次分频得到的1Hz时钟信号作为模块的时钟信号,设置17位数据用来存储当前时间([5:0]表示秒,[11:6]表示分,[16:12]表示小时),当秒达到59时,则下一次操作为秒位置0,同时分位加1,分钟与小时的关系依次类推。同时当load信号使能时,即设置时间功能打开时,数据位数据将被加载进来的数据覆盖。 // timing_module.v `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: UESTC // Engineer: Qy_Ley // // Create Date: 2021/03/14 15:06:37 // Design Name: Digital Clock for EES331 // Module Name: timing_module // Project Name: Digital Clock // Target Devices: EES331 // Tool Versions: Vivado 18.3 // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module timing_module( input i_clk_1Hz, input i_load, input i_rstn, input i_ena, input [16:0] i_load_hms, // [5:0] for sec, [11:6] for min, [16:12] for hour, BCD coding output [16:0] o_hms // [5:0] for sec, [11:6] for min, [16:12] for hour, BCD coding ); // wire m_co_sec, m_co_min; // Carry output from second & minute counter reg ld; reg [16:0] ld_cnt; reg [4:0] hour_cnt; reg [5:0] min_cnt,sec_cnt; always @(posedge i_clk_1Hz) begin ld <= i_load; ld_cnt <= i_load_hms; end //clock cross-domain buffer always @(posedge i_clk_1Hz or negedge i_rstn) begin if(!i_rstn) begin hour_cnt <= 0; min_cnt <= 0; sec_cnt <= 0; end else if(ld) begin {hour_cnt, min_cnt, sec_cnt} <= ld_cnt; end else if(i_ena) begin if(sec_cnt == 6'd59) begin sec_cnt <= 0; if(min_cnt == 6'd59) begin min_cnt <= 0; if(hour_cnt == 5'd23) begin hour_cnt <= 0; end else begin hour_cnt <= hour_cnt+1; end end else begin min_cnt <= min_cnt+1; end end else begin sec_cnt <= sec_cnt+1; end end end /* Complete the counter for second, minute, hour */ assign o_hms = {hour_cnt, min_cnt, sec_cnt}; endmodule 3.1.3 control_module 为系统控制的模块,采用有限状态机的描述方式,如图: ...

April 15, 2023 · 4 min · laning

校园电信宽带自动连接脚本

项目起因 校园电信宽带一大痛点是在路由器断电后,需要手动进行身份认证。在外面遇到寝室断电或者早上赶早八,而没有连接网络,当需要远程宿舍网络时,就会很崩溃。前不久看到有人在朋友圈分享自己写的脚本,今天自己实践一下。 脚本地址 作者提供的地址:https://gist.github.com/learnerLj/e327816e735ac8f12a62d18029bb45f0 在此基础上,我修改了部分代码,更便于后续的部署实践 修改后的地址:https://github.com/laningya/UESTC-WORK/blob/master/%E8%87%AA%E5%8A%A8%E8%BF%9E%E6%8E%A5%E7%94%B5%E4%BF%A1%E7%BD%91%E7%BB%9C/autoConnectNetwork.py 先看一下脚本需要提供的信息 post_url中的IP地址 post_data中userId,password,queryString 实践过程 获取脚本需要的信息 获取post_url中的IP地址和post_data中的queryString字段 (原文图片未随备份提供:images/1.png) 如图,在电信宽带认证界面的url中,172.25.249.64即为posturl中需要的IP地址;index.jsp? 之后的所有内容为post_data中queryString需要的信息。 获取post_data中的userId和password 如图,需要打开在浏览器打开f12开发者工具,如图为Google Chrome的调试页面。点击网络,保留日志,双击InterFace.do?method=login选项,选择载荷,找到其中的userId和password字段,并填入代码中,**注意:**pasaword字段后面还有个queryString字段,在步骤1中我们也有一个相同名称的字段,而程序需要的是步骤1中的字段。 至此,我们就获取到脚本需要的所有信息,即可以运行脚本。 在树莓派等设备上部署自动执行脚本 树莓派部署自动执行脚本的形式有很多,本次采用crontab服务,在pi用户下,命令行执行以下命令 cd && mkdir .script && cd .script && touch autoConnectNetwork.py 通过vim或者nano编辑器将脚本内容添加到 autoConnectNetwork.py中 添加crontab任务,在命令行执行 crontab -e 在文件末尾添加 * * * * * /usr/bin/python /home/pi/.script/autoConnectNetwork.py > /dev/null 2>&1 & 通过Docker部署脚本 下载项目文件和Docker环境以及填写配置文件。Docker的安装方法可以参考官方文档,Docker部署文件地址为:https://github.com/laningya/UESTC-WORK/tree/master/%E8%87%AA%E5%8A%A8%E8%BF%9E%E6%8E%A5%E7%94%B5%E4%BF%A1%E7%BD%91%E7%BB%9C/Docker 需要的配置与前面一致,配置文件路径为Docker/config/config.txt,填入必要的信息。 构建镜像。如果你是Linux用户,在Docker文件夹下,命令行执行 docker build --no-cache -t laningya/uestc_auto_connect_network:v1 . 不要忘记复制后面的点 说明: build:docker构建镜像的命令 --no-cache:忽略缓存 -t:指定构建后的镜像名 (原文图片未随备份提供:images/docker_build.png) 运行镜像。还是在/Docker目录下,命令行执行 docker run -itd --restart=always --net=host --name autoConnectNetwork laningya/uestc_auto_connect_network:v1 说明: run:docker运行容器的命令 -itd:可以简单理解为在后台执行 --restart=always:容器运行出现错误时,自动尝试重启,关键参数,不能轻易取消 --net=host:指定容器网络为host模式,便于直接访问路由器 --name utoConnectNetwork 指定容器名,便于后续管理 laningya/uestc_auto_connect_network:v1 我们前面构建的镜像名称 (原文图片未随备份提供:images/docker_run_ps.png)

April 6, 2023 · 1 min · laning

ESP8266开发记录

项目材料 ESP8266-12E开发板一块 ESP8266是一款物联网WiFi芯片(MCU),常见型号有ESP-01到ESP-13等,每个型号的引脚和功能不同。 SSD1306屏幕一块 I2C接口的显示屏幕,在Github上有开源驱动的驱动程序 效果图 项目功能介绍 连接指定WIFI 通过NTP服务获取时间并在屏幕上显示 通过心知天气提供的API,获取本地实时天气并显示 开发环境及配置 ESP8266常见开发环境有Arduino IDE和ESP8266 SDK两种。项目使用Arduino IDE这一集成开发环境,优点在于Arduino IDE在安装ESP8266函数库以及串口调试都更为容易。而ESP8266 SDK是乐鑫科技提供的开发工具,需要在Linux下编译开发套件并且需要单独下载串口调试工具等软件,配置相对麻烦。 Arduino IDE配置 下载 Arduino IDE 打开软件->文件->首选项->附加开发板管理器地址,添加http://arduino.esp8266.com/stable/package_esp8266com_index.json添加完成后,点击好。 在Arduino IDE中点击工具->开发板->开发板管理器,在开发板管理器里面搜索esp8266并进行安装 在Arduino IDE的开发板菜单中找到“NodeMCU开发板”,选择ESP8266-12E 将esp8266通过数据线接入电脑,右键此电脑->管理->设备管理器->端口,查找到开发板的端口号 在Arduino IDE中点击工具->端口,选择上面的端口 通过Blink实例程序,验证是否搭建完成开发环境 点击文件->示例->Basics->Blink 点击上传按钮,等待一分钟左右,可以观察到esp8266开发板上的led闪烁证明开发环境搭建完成。 依赖的第三方库 在Arduino IDE中点击工具->管理库,添加NTP库与SSD1306库 配置项目 配置WiFi信息,用你的WiFiSSID和密码替换*** 配置心知天气相关信息,用你的私钥替换***,location替换为你所在城市,如上海为shanghai,北京为beijing等,具体可参考心知天气官方开发者文档** 注意:如果你不关心代码是的问题,至此可以直接在Arduino IDE中点击上传按钮了** WeatherNow类 class WeatherNow { public: //配置心知天气相关信息 void config(String ,String ,String ,String); //获取天气信息 void getData(); public: //天气 String text; //温度 String temperature; //体感温度 String feels_like; //气压 String pressure; //相对湿度 String humidity; //能见度 String visibility; //风向 String wind_direction; //风向角度 String wind_direction_degree; //风速 String wind_speed; //风力等级 String wind_scale; //云量 String clouds; //露点温度 String dew_point; //日期 String date; private: int getPayload(); String _url; String _payload; }; WeatherDay类 class WeatherDay { public: void config(String ,String ,String ,String); void getData(); public: String date0; String date1; String date2; String text_day0; String text_day1; String text_day2; String text_night0; String text_night1; String text_night2; String code_night0; String code_night1; String code_night2; String high0; String high1; String high2; String low0; String low1; String low2; String precip0; String precip1; String precip2; String wind_direction0; String wind_direction1; String wind_direction2; String wind_direction_degree0; String wind_direction_degree1; String wind_direction_degree2; String wind_speed0; String wind_speed1; String wind_speed2; String wind_scale0; String wind_scale1; String wind_scale2; String rainfall0; String rainfall1; String rainfall2; String humidity0; String humidity1; String humidity2; private: int getPayload(); String _url; String _payload; }; 进一步开发计划 受限于ssd1306显示内容有限,因而考虑更换屏幕,显示未来天气等信息。

April 5, 2023 · 1 min · laning

数字集成电路设计实验——流水灯

1. 课程信息 实验地点:****** **实验时间:**2021.03.25 实验时长: 3小时(4节课) 2. 实验要求 驱动板上LED1 ~LED8按如下2个模式循环闪烁: ① 每个灯亮1s灭1s,从右至左依次闪烁,共8次 ② 每个灯亮1s灭0.5s,从左至右间隔闪烁,共4次 思考(加分项): 如何使用按键控制流水灯的闪烁时间? 如:按一次亮1s,再按一次变为亮0.5s。 2. 如何使用按键控制流水模式? 如:按一次8个灯依次闪烁,再按一次LED2/4/6/8间隔闪烁 3. 设计与实现 3.1 实验步骤 在Vivado中创建工程,并添加.v文件 阅读实验提供的源码文件并完善部分代码 添加testbeach文件,做仿真分析 添加.xdc文件(将模块引脚与开发板引脚绑定),并下板验证 3.2 电路功能说明 (包括各个模块功能、关键代码分析,可以使用文字、框图、功能表、状态图等进行说明) 3.2.1 关键代码分析 计数器模块 always @(posedge sys_clk or negedge sys_rst_n) begin if (!sys_rst_n) counter1 <= 32'd0; else if(!led_control)//led_control==0为状态1 if (counter1 < 32'd200_000_000)//系统时钟100M,计数器计200M次即2s counter1 <= counter1 + 1'b1; else counter1 <= 32'd0; else counter1 <= 32'd0; //状态2时,counter1置零不计数 end //通过led_control信号来控制计数器2秒或1.5秒,并分别记为counter1和counter2 模式控制模块 always @ (posedge sys_clk or negedge sys_rst_n) begin if(!sys_rst_n) cnt<=32'd0; else if(cnt<32'd2200_000_000) cnt<=cnt+1; else cnt<=0; end //cnt计数器来记录一轮循环,cnt<1600_000_000,即小于16秒为左移,cnt>1600_000_000时为右移。 led移动 always @(posedge sys_clk or negedge sys_rst_n) begin if(!sys_rst_n) led1<=8'b00000001; else if (!led_control) begin if (counter1 == 32'd200_000_000) led1 <= led1<<1; //左移1位 else led1 <= led1; end else led1 <= 8'b00000001;//状态2时led1就在led2基础上左移,状态转换时即可无缝衔接 end always @(posedge sys_clk or negedge sys_rst_n) begin if (!sys_rst_n) led <= 8'b00000001; else case (led_control) 0 : if(counter1 < 32'd100_000_000) led = led1; else led = 8'b0; //进入状态1时,先让灯亮1s,再将移位寄存器led1的值赋值给led 1 : if(counter2 < 32'd100_000_000) led = led2; else led = 8'b0; //进入状态2时,先让灯亮1s,再将移位寄存器led2的值赋值给led default : led <= led; endcase end //分别用led1和led2来表示两种状态下的led状态,led_control为0时,当达到2秒时,led1进行左移。通过counter1的值判断是否达到1秒,未达到时,将led1的值赋给led,否则led置为8’b0。led_control为1同理 3.2.2 系统级表示 ...

March 27, 2023 · 2 min · laning

GPU在并行信息处理中的应用

摘要 随着前端数据采集设备精度的不断提高,对信息处理系统的实时性、准确性提出更高的要求。而从日趋完善的计算机体系结构中,半导体工艺难以取得重大突破的情况下,想要获取更高的计算性能(信息处理能力),我们就必须探索另外一条道路——并行处理。GPU在应用于图像处理领用,其CUDA平台的支持,对于浮点运算的高效,因而作为并行信息处理的技术被广泛应用。 关键词 GPU,CUDA ,并行信息处理 1. 并行处理技术 1.1 并行处理技术介绍 并行处理或并行计算是指利用多台计算机或处理器同时执行运算任务,从而减少解决问题所需要的时间。一般可分为时间并行计算和空间并行计算。 时间上的并行计算叫做流水线处理,即多个处理器按照处理时间的先后顺序执行计算;空间上的并行是指多个处理器同时执行计算,各处理器在时间上相互独立。并行处理技术主要研究空间上的并行,即通过总线方式将多个计算机或处理器并联,从而获得更快的处理速度。 并行计算根据规模不同,分为一下几个层次。如图所示,最底层是单核指令级并行(ILP),即单个处理器,但可同时执行多条指令;其上为多核并行,即单芯片拥有多个处理器核心;再往上是多处理器并行,即通过多个芯片之间分工协作做到并行处理;最上层为集群或分布式并行,通过网络互联实现超大规模并行运算,可参考大型数据中心。 1.2 Flynn计算机体系分类 1966年,Flynn根据指令流和数据流的多倍性对计算机体系结构进行了分类。分为单指令流单数据流模式(SISD),单指令流多数据流模式(SIMD),多指令流单数据流模式(MISD),多指令流多数据流模式(MIMD)。其中SIMD和MIMD属于并行处理器。 SIMD和MIMD处理器结构示意图如图所示。SIMD只有一个控制单元,这个控制单元控制多个计算处理单元,这些处理单元共享存储器或信号进行通信。MIMD处理器拥有多个控制单元,每个控制单元控制自己的计算单元,通过共享存储器或信号进行通信。 2.CUDA GPU并行架构 CUDA是设备计算统一框架的简称(Compute Unified Device Architecture)。其目的是为了用C语言再GPU上进行编程,而无需关注图形API和GPU编程的知识。它可以运行和访问GPU设备的指令和存储空间,从而可以非常快速入门并且从GPU的并行计算中获利。再此之前,GPGPU编程需要针对特定的处理器,而不是标准的API,不能在不同GPU之间进行移植。在CUDA并行架构中,GPU被当作CPU的协处理器来运作,一些数据并行独立且计算密集的函数适合放入GPU中运行。 图为CUDA并行架构框图。底层为CUDA的组成部件,其包括:支持CUDA并行计算的GPU、支持CUDA的操作系统内核、用户模式驱动、PTX并行计算指令集。 在软件层次,CUDA提供了完备的软件开发环境,包括编译器、调试器、性能测评工具及基础库。并且支持C语言编程,从而可以支持其他高级语言,比如Java和Python。CUDA提供了两种编程接口:设备级编程接口和语言集成编程接口。 3. CUDA 硬件原理 CUDA 硬件基础结构由一组多线程流处理器(SM,Multitreaded Stream Multiprocessors)的单元组成。如图所示,SM中又有多个SP(Stream Processors)负责具体运算。多线程流处理器SM被设计成拥有可以同时执行上百个线程的能力。为了获得同时执行这么多线程的能力,CUDA从SIMD结构上发展出单指令流多线程(SIMT, Single Instruction Multiple Thread)结构。 SM多线程处理器负责创建、调度和执行线程,这些线程以32个为一组,成为一个Warp。组成同一个Warp的单独线程从同一个程序地址执行。但是他们拥有单独的指令地址计数器和独立的存储器。所以他们可以互不干扰的运行各自的指令及分支。 当多线程处理器执行一个或多个线程块时,它把他们分为独立的Warp,之后由Warp调度器进行调度。线程块中的线程根据线程号线性的分组为Warp,即前32个线程号的线程为第一个Warp,接下来32个线程号为第二个Warp,以此类推。一个Warp内的线程每次执行一条指令,所以如果Warp里的32个线程在执行时执行相同的指令路径可以使效率最大化。如果一个Warp中的线程在执行过程中产生了分支,则Warp顺序执行完每个分支,直到所有分支都执行完毕后会和到同一个指令开始执行。不同的Warp各自独立运行,在一个Warp内产生的分支不影响其他的Warp。对于一个特定的线程块,它只能在一个多线程处理器(SM)中执行。但是一个多线程处理器可以执行多个线程块。

December 19, 2022 · 1 min · laning

FPGA工程应用开发综合实验报告二

基于FPGA的BPSK信号产生器设计 2022年12月19日 摘 要 本次基于FPGA的计时器设计,在熟悉Quartus基本操作、Verilog编程语言的基本规则、SignalTap的基本应用,在前两次PN码序列产生器和DDS设计的基础上,通过分模块设计后进行连接的方式,完成基于FPGA的BPSK信号产生器设计。 本次设计分为PLL分频模块、自动复位模块、PN码生成模块、DDS模块以及IP核实现方式的NCO模块。 实验需求分析 技术指标分析 功能指标分析 PN码(Gold码)产生器模块需对传输数据进行扩频;DDS模块生成所需频率的载波信号;通过相位选择法(2选1数据选择器)来实现调制。 性能指标分析 减少信息传输延迟,调制后的信号应尽量与原数据一致。 系统方案设计 顶层设计 项目实现所要用到的时钟问题分析 时钟频率控制是FPGA设计的重要组成部分。通过上面功能指标分析,我们不难发现,实现BPSK的调制,我们需要三个时钟来完成我们的设计。一是我们需要一个时钟来控制我们的DDS模块来产生我们需要的频率的载波信号;二是我们需要一个时钟来控制PN码(Gold)码的产生;三是我们需要一个调制信息的时钟 DDS的两种实现 我们通过调用IP核和查找表法两种方法实现DDS。调用IP的好处在于设计简单,但其中的延迟为随机确定的数,在设计未完成前,我们很难确定其值为多少,而当通过查找表来实现DDS,我们能够很好的控制这个延迟,从而提升系统的性能。 PN码序列生成器 将两个PN码进行异或运算(模2加法)生成Gold码。 具体顶层设计文件截图: 模块设计 例如: 1)PLL分频模块 由上文中对系统时钟分析可知,我们需要250MHz 、5MHz、10KHz分别作为DDS系统钟、PN码生成器码钟和产生调制信息的码钟,如图1所示: 图1 PLL模块 2)自动复位模块 本模块接收PLL分频后所得的250MHz时钟信号,如图2: 图2 自动复位模块 3)PN码生成器模块 本模块接收250MHz的c0和5MHz的c1,如图3: 图3 PN码生成器模块 图5.1023位m序列产生器原理框图 如图5:为1023位m序列产生器的原理图, {an}=c1an-1+c2an-2+……+cna0 由于m序列自相关良好但是互相关特性不好且可用于产生 图6:Gold序列产生原理框图 m序列的本原多项式较少,在一些要求地址码多的系统钟m序列很难满足要求,因而引入Gold码。产生Gold码序列可以将两个m序列的移位寄存器并联再进行模2加法,如图6为生成Gold码的逻辑图。图7为顶层文件的Gold码实现。 图7:生成Gold码的顶层文件 4)DDS模块 本模块接收c0和频率控制字作为输入,32位相位信息作为输出,结构如图8所示: 图8:DDS模块 由DDS原理我们可知:K=f0/fc*2N 其中fc为250MHz,f0为25MHz,N为32,计算出K值约为429496730,输出相位信息后,通过查表的方式我们得到最终结果。 IP核加二选一数据选择器实现方式,如图9所示**:** 图9:IP核加二选一数据选择器实现 二.基于SignalTap分析重点时序 本次实验,我们理论上应该看到经过自己设计的DDS模块与调用IP核相比延迟更低。BPSK调制的基本流程如下: 调制信息与通过PN码发生器进行扩频,通过扩频操作可以降低我们调制信息的峰值,减少信息被检测的概率。 DDS模块产生我们所需频率的载波信号,将经过扩频的调制信息通过调相的方式,0和1选择相反相位,即相差为pi的,从而实现BPSK的全过程。 三.反思与总结 1.关于系统时钟c0(250MHz)难以达到 因为我们的FPGA的默认时钟频率为50MHz,想要达到250MHz对我们开发板有一些困难,所以我们可以适当降低c0的时钟频率,比如可以选择200MHz作为系统时钟。 2.总结反思 本次基于FPGA的BPSK设计实验,从了解PN码这种扩频通信的理念,到通过查找表的方式,实现直接数字频率合成技术,得到我们所需频率的载波信号,到最后通过调相的方式,将我们的信号调制到载波信号钟,从而实现BPSK。进一步熟悉了FPGA开发的整体流程以及模块化的复用思想,了解数字通信调制信息的过程。 四.参考文献 ...

December 19, 2022 · 1 min · laning

FPGA工程应用开发综合实验报告一

基于LCD的显示系统设计 2022年11月30日 摘 要 本次基于FPGA的LCD显示系统设计,在熟悉Quartus基本操作、Verilog编程语言的基本规则、SignalTap的基本应用后,通过自顶向下、分模块设计后进行连接的方式,完成控制FPGA在LCD屏幕显示内容。 本次设计分为PLL分频模块、上电复位模块、显示控制模块、显示驱动模块组成。通过分功能分模块的设计方式,便于调试,较好地完成了本次设计任务。 一、 实验需求分析 技术指标分析 (1) 功能指标分析 通过FPGA控制LCD,实现在LCD上显示自己姓名英文书写,对外提供良好的接口,可实现修改源代码来显示不同内容。 (2) 性能指标分析 二、 系统方案设计 顶层设计 图1:Cyclone IV E FPGA芯片和 LCD模块间连接示意图 表1:LCD模块引脚配置说明 分析图1、表1,我们能得到FPGA与LCD模块之间是8根数据线、5根控制线,为了简化我们程序内部的逻辑,经过分析,在本次实验中,我们只对LCD进行写操作,而误差控制我们通过增大每次写数据后的延时来减小,所以LCD_RW可以始终置0;LCD_ON始终置1;LCD_BLON可始终置1或0。 进而我们得到了下面的顶层设计 三、 模块设计 例如: 1)PLL分频模块 由于实验板载FPGA提供50MHz晶振,通过Quartus自带的PLL模块,为了更快实现在LCD上显示所需内容,设置参数,产生50MHz的时钟,作为本次设计的系统时钟,如图1所示: 图1 PLL模块 2)上电复位模块 本模块接收PLL分频后所得的50MHz时钟信号,通过Cont变量进行计数计时,便于后续模块使用,框图如图2: 图2 计数器模块 3)显示驱动模块 本模块接收系统时钟与上电复位模块输出以及显示控制模块的输出mLCD_Done;产生mLCD_Start信号、8位数据线内容和LCD_RS信号,如图3所示: 图3 显示驱动模块 在此显示之前,我们需要位LCD进行初始化操作,分析图4,我们需要配置LCD的基本功能,具体代码与分析如下: 图4 1602LCD控制指令 有限状态机分析(如图5): S0:写内容,将数据内容送给数据线,并自动跳转状态S1; S1:等待mLCD_done信号,有效时跳转到状态S2; S2:计数延时,为了简化程序,我们通过延迟来保证数据正确写入到LCD中,当延时结束,计数归零,并跳转到状态S3; S3:当S2的延时后,S3在LCD显示屏上自动向后移位,并跳转到状态S0 图5 有限状态机示意图 由编码表找到需要的字符对应的二进制表示,代码如下,映射表如图6: 图6 字符映射表 4)显示控制模块 本模块接收系统时钟与上电复位模块输出以及mLCD_start作为输入,输出为LCD_EN与mLCD_done信号,如图7: 图7 显示控制模块 ...

November 30, 2022 · 1 min · laning

CSAPP学习笔记

深入理解计算机系统(C语言、数据结构、微嵌、编译原理、数电、模电) 第一章:计算机系统漫游 编译系统 hello.c->hello.i gcc -E hello.c -o hello.i hello.i->hello.s gcc -S hello.i -o hello.s hello.s->hello.o gcc -c hello.s -o hello.o hello.o->hello gcc hello.o -o hello 第二章:信息的表示和处理 //数据在不同架构处理器下的表示 #include <stdio.h> typedef unsigned char * byte_pointer; void show_bytes(byte_pointer start, size_t led) { size_t i; for (i = 0 ;i < led; i++) { printf("%.2x",start[i]); } printf("\n"); } void show_int(int x) { show_bytes((byte_pointer)&x,sizeof(int)); } void show_float(float x) { show_bytes((byte_pointer)&x,sizeof(float)); } void show_pointer(void *x) { show_bytes((byte_pointer)&x,sizeof(void *)); } int main() { int i =12345; show_int(i); return 0; } 整数、浮点数在计算机内部的表示与运算 第三章:程序的机器级表示 while、do-while、for性能分析 三种都是通过条件测试和跳转指令实现的。 ...

July 14, 2022 · 2 min · laning