北京理工大学电路与电子线路设计实践
RiskV相关设计
我是按照老师的知道一步一步做的,仅供参考。
TASK1:
1)修改 timer.v、timer_int的main.c timer.h; 实现simple例程中的sum累加功能(第一个for循环,sum终值5050)。
2) timer.v中添加i、sum两个寄存器,能将cpu中每一步计算的i、sum值下传至timer.v模块。
3)GTKwave软件中可直接观察到i、sum这两个寄存器的值,从而看到sum循环累加的完整计算过程。
4)timer的main.c中添加对sum最终累加值的判断功能,在cmd的仿真命令执行后,能看到pass/fail提示。
TASK2:
1) 将simple例程中的sum累加功能,移植到verilog编写的硬件模块中(例如timer.v),从而将软件计算变为硬件计算,cpu配置并启动硬件模块进行sum累加。
2) main.c中要添加对硬件模块内寄存器值的读取功能,实现硬件模块完成sum累加后,通过中断触发cpu读取计算结果并进行校验(步骤4)。
3) GTKwave软件中可直接观察到i、sum这两个寄存器的值,从而看到sum循环累加的完整计算过程。
4) timer的main.c中添加对sum最终累加值的判断功能,在cmd的仿真命令执行后,能看到pass/fail提示。
注:task2中所用算法可自行更换,报告首段需写明算法作用,以及选用的原因。不可直接照抄第一批次的task2。
Task1:
代码在原有基础上添加,故粘贴修改部分
main.c文件添加代码(累加求和部分)
//添加变量
int i;
int sum = 0;
// sum = 5050
for (i = 0; i <= 100; i++) {
sum += i;
TIMER0_REG(TIMER0_I) = i;
TIMER0_REG(TIMER0_SUM) = sum;
}
//结果判断函数
if (sum == 5050)
set_test_pass();
else
set_test_fail();
return 0;
timer.h添加地址定义
#define TIMER0_I (TIMER0_BASE + (0x0C))
#define TIMER0_SUM (TIMER0_BASE + (0x10))
timer.v添加寄存器以及数据写入
//设定总线地址,以方便映射
localparam REG_I = 5'hc;
localparam REG_SUM = 5'h10;
//添加sum和i两个寄存器
reg[31:0] timer_i;
reg[31:0] timer_sum;
// write regs
always @ (posedge clk) begin
if (rst == `RstEnable) begin
timer_ctrl <= `ZeroWord;
timer_value <= `ZeroWord;
end else begin
if (we_i == `WriteEnable) begin
case (addr_i[4:0])
REG_CTRL: begin
timer_ctrl <= {data_i[31:3], (timer_ctrl[2] & (~data_i[2])), data_i[1:0]};
end
REG_VALUE: begin
timer_value <= data_i;
end
//向寄存器中写入数据
REG_I: begin
timer_i <= data_i;
end
REG_SUM: begin
timer_sum <= data_i;
end
endcase
仿真结果和gtkwave的波形
make编译:
运行代码:
修改出现fail:
显示波形:
timer_i,timer_sum是添加的寄存器,能看到依次写入数据并最终求得结果。
Task2:
将simple例程中的sum累加功能,移植到verilog编写的硬件模块中(例如timer.v),从而将软件计算变为硬件计算,cpu配置并启动硬件模块进行sum累加。
累加部分代码(.h文件):
//sum求和
#define TIMER0_SUM (TIMER0_BASE + (0x0C))
#define TIMER0_I (TIMER0_BASE + (0x10))
#define TIMER0_SUM_CTRL (TIMER0_BASE + (0x14))
#define TIMER0_I_VALUE (TIMER0_BASE + (0x18))
累加部分代码(.v文件):
总线部分添加:
//sum求和
localparam REG_SUM = 5'hc;
localparam REG_I = 5'h10;
localparam REG_SUM_CTRL = 5'h14;
localparam REG_I_VALUE = 5'h18;
寄存器部分添加:
//sum求和
reg[31:0] timer_sum;
reg[31:0] timer_i;
reg[31:0] timer_sum_ctrl;
reg[31:0] timer_i_value;
reg[31:0] timer_sum_result;
用时钟上升沿进行计数
//sum,add by my
always @ (posedge clk) begin
if (rst == `RstEnable) begin
timer_i <= `ZeroWord;
timer_sum <= `ZeroWord;
end else begin
if(timer_sum_ctrl[0] == 1'b1) begin
timer_i <= timer_i + 1'b1;
timer_sum <= timer_sum + timer_i;
if (timer_i >= timer_i_value + 1'b1) begin
timer_i <= `ZeroWord;
timer_sum <= `ZeroWord;
end
end
else begin
timer_i <= `ZeroWord;
timer_sum <= `ZeroWord;
end
end
end
写使能部分更改:
// write regs
always @ (posedge clk) begin
if (rst == `RstEnable) begin
timer_ctrl <= `ZeroWord;
timer_value <= `ZeroWord;
timer_sum_ctrl <= `ZeroWord;
timer_i_value <= `ZeroWord;
end else begin
if (we_i == `WriteEnable) begin
case (addr_i[4:0])
REG_CTRL: begin
timer_ctrl <= {data_i[31:3], (timer_ctrl[2] & (~data_i[2])), data_i[1:0]};
end
REG_VALUE: begin
timer_value <= data_i;
end
//sum求和
REG_I: begin
timer_i <= data_i;
end
REG_SUM: begin
timer_sum <= data_i;
end
REG_SUM_CTRL: begin
timer_sum_ctrl <= {data_i[31:3], (timer_sum_ctrl[2] & (~data_i[2])), data_i[1:0]};;
end
REG_I_VALUE: begin
timer_i_value <= data_i;
end
endcase
end else begin
if ((timer_ctrl[0] == 1'b1) && (timer_count >= timer_value)) begin
timer_ctrl[0] <= 1'b0;
timer_ctrl[2] <= 1'b1;
end
else if((timer_sum_ctrl[0] == 1'b1) && (timer_i >= timer_i_value)) begin
timer_sum_ctrl[0] <= 1'b0;
timer_sum_ctrl[2] <= 1'b1;
end
end
end
end
// read regs添加:
REG_SUM: begin
data_o = timer_sum_result;
end
中断更改:
assign int_sig_o = ((timer_sum_ctrl[2] == 1'b1) && (timer_sum_ctrl[1] == 1'b1))? `INT_ASSERT: `INT_DEASSERT;
main.c中要添加对硬件模块内寄存器值的读取功能,实现硬件模块完成sum累加后,通过中断触发cpu读取计算结果并进行校验(步骤4)。
主函数部分:
//添加变量
int sum = 0;
#ifdef SIMULATION
TIMER0_REG(TIMER0_VALUE) = 500; // 10us period
TIMER0_REG(TIMER0_CTRL) = 0x07; // enable interrupt and start timer
TIMER0_REG(TIMER0_I_VALUE) = 100;
TIMER0_REG(TIMER0_SUM_CTRL) = 0x07; //START SUM
while (1) {
if (count == 1) {
TIMER0_REG(TIMER0_CTRL) = 0x00; // stop timer
TIMER0_REG(TIMER0_SUM_CTRL) = 0x00;
count = 0;
// TODO: do something
sum = TIMER0_REG(TIMER0_SUM);
if (sum == 5050)
set_test_pass();
else
set_test_fail();
break;
}
}
Handler函数更改:
TIMER0_REG(TIMER0_SUM_CTRL) |= (1 << 2); // clear int pending
GTKwave软件中可直接观察到i、sum这两个寄存器的值,从而看到sum循环累加的完整计算过程。
timer的main.c中添加对sum最终累加值的判断功能,在cmd的仿真命令执行后,能看到pass/fail提示。
在.v文件中添加结果部分:
//result_output
always @ (posedge clk) begin
if (rst == `RstEnable) begin
timer_sum_result <= `ZeroWord;
end
else begin
if (timer_i == timer_i_value + 1'b1) begin
timer_sum_result <= timer_sum;
end
else begin
timer_sum_result <= timer_sum_result;
end
end
end
北京理工大学电路与电子线路设计实践相关推荐
- 面对电磁辐射干扰,如何轻松进行电子线路设计布局?
面对电磁辐射干扰,如何轻松进行电子线路设计布局? 电磁环境包含辐射和传导能量.EMC也包含辐射和敏感度两方面.辐射是指产品不必要地产生电磁能量.为了打造一种具备电磁兼容性的环境,通常需要控制辐射.敏感 ...
- 北京理工大学计算机系博导,北京理工大学信息与电子学院博导介绍:罗森林
姓 名:罗森林 所在单位:北京理工大学信息与电子学院 E-mail:luosenlin@bit.edu.cn 学科专业一 信息与通信工程 研究方向一 信息安全.生物信息处理.媒体计算 学科专业二 社会 ...
- 北京理工大学计算机调剂非全,北京理工大学信息与电子学院研究生调剂(非全日制)...
考研路漫漫,各位小伙伴都查到了的自己的考研成绩,有一次上岸的,也有分数未达线的.各位小伙伴还要重新振奋努力调剂择校,调剂选择时间有限,希望小伙伴都能考到自己的理想院校,小编为大家整理了"北京 ...
- 应用计算机测定线性电阻电路图和实物图,中国大学MOOC电子线路设计、测试与实验二网课答案...
中国大学MOOC电子线路设计.测试与实验二网课答案 字体大小:大 | 中 | 小 2020-04-26 19:57 阅读(1017) 分类: 中国大学MOOC电子线路设计.测试与实验二网课答案 打开右 ...
- 电子线路设计技巧1:多电阻串联代替一个电阻
从这篇日志开始对电子线路分类下的日志开始编号,本篇日志讲述为什么要用多个电阻代替一个电阻. 这几日项目遇到了一个问题,厂家给的参考电路,在电阻分压采样上不是直接使用1个电阻,而是使用多个电阻串 ...
- 电路与电子线路实验一万用表的设计与仿真——北京理工大学
一.实验任务 1. 直流电流表 2. 直流电压表 3.交流电压表 4. 子电路 二.实验目的 1. 设计直流电流表模块 2. 设计直流电压表模块 3.交流电压表 4. 子电路 三.设计要求 1. I1 ...
- 电路与电子线路实验I(软件)——北京理工大学
(第一部分) 实验1 叠加定理的验证 一.实验任务 完成叠加原理的验证. 二.实验原理 在多个独立电源.线性受控源和线性无源元件共同组成的线性电路中,某一支路的电压(或电流)等于每一个独立电源单独作 ...
- 电路与电子线路实验二-mutisim仿真实验——北京理工大学
实验一 一.实验步骤 元器件的调用与参数设置 调用电阻Rg_1=400kΩ,Rg_2=200kΩ, Rd=2kΩ, Rs=0.5kΩ, RL=2kΩ 电容C1=C2=C3=100μF 直流电压源 ...
- 电子线路设计技巧6:Boost电路的参数设计
本文以实例方式介绍Boost电路的参数设计方法.项目需求:12V升压至50V,功率35W. 先看示例电路图,如下图所示. 在进行具体的参数计算之前,我们先简要的分析一下Boost电路的工作原理. 1. ...
最新文章
- 黑色星期五Friday the Thirteenth
- LIVE 预告 | TransGAN:丢弃卷积,纯Transformer构建GAN网络
- 寻找一个字符串中所有重复字符的索引
- Hadoop3.0 WordCount测试一直Accept 状态,Nodes of the cluster 页面node列表个数为0
- [Kaggle] Spam/Ham Email Classification 垃圾邮件分类(spacy)
- c++代码健壮性_复活Navex-使用图查询进行代码分析(上)
- oracle基础与应用
- linux 下解决arp病毒攻击时上网问题的最简单的治标办法
- c++ 宏 stdin 和 STDIN_FILENO 区别
- html批量转换ppt,将ppt批量转换成图片(一张幻灯片转成一张图片)
- 流程图设计(泳道图 | 任务流程图 | 页面流程图)
- 没所谓移动开发寒冬,不过是大鱼吃小鱼
- 解决git push报错问题
- 【云原生】SPL 提速天体聚类任务 2000 倍【文末送书】
- filebeat收集日志到elsticsearch中并使用ingest node的pipeline处理
- 记录一下解决win10无法分屏问题
- 小程序停止html5音乐,微信小程序API 音乐播放控制
- 开发web、app应用实战中用到的资料汇总
- 技术宅男买房记之建筑日照采光计算
- Android中禁止WebView滑动
热门文章
- 计算机专业好还是铁道运输管理好,铁道运输管理专业就业前景好原因公布!
- QT5.15.2静态编译MSVC2019
- 41岁中兴员工:这可能是我第5次失业
- 『WX运动』想上封面?就你那点步数怎么能行?点进来!老铁,借一步说话
- Windows10笔记本电脑重启时卡死不动的解决方案
- 使用 bitnami/postgresql-repmgr 镜像快速设置 PostgreSQL HA
- python练习题12:数据库基础
- 尚硅谷2020最新版宋红康JVM教程更新至中篇(java虚拟机详解,jvm从入门到精通)
- 流氓软件,你装了吗?
- 弹弹弹,多彩小球弹跳