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

北京理工大学电路与电子线路设计实践相关推荐

  1. 面对电磁辐射干扰,如何轻松进行电子线路设计布局?

    面对电磁辐射干扰,如何轻松进行电子线路设计布局? 电磁环境包含辐射和传导能量.EMC也包含辐射和敏感度两方面.辐射是指产品不必要地产生电磁能量.为了打造一种具备电磁兼容性的环境,通常需要控制辐射.敏感 ...

  2. 北京理工大学计算机系博导,北京理工大学信息与电子学院博导介绍:罗森林

    姓 名:罗森林 所在单位:北京理工大学信息与电子学院 E-mail:luosenlin@bit.edu.cn 学科专业一 信息与通信工程 研究方向一 信息安全.生物信息处理.媒体计算 学科专业二 社会 ...

  3. 北京理工大学计算机调剂非全,北京理工大学信息与电子学院研究生调剂(非全日制)...

    考研路漫漫,各位小伙伴都查到了的自己的考研成绩,有一次上岸的,也有分数未达线的.各位小伙伴还要重新振奋努力调剂择校,调剂选择时间有限,希望小伙伴都能考到自己的理想院校,小编为大家整理了"北京 ...

  4. 应用计算机测定线性电阻电路图和实物图,中国大学MOOC电子线路设计、测试与实验二网课答案...

    中国大学MOOC电子线路设计.测试与实验二网课答案 字体大小:大 | 中 | 小 2020-04-26 19:57 阅读(1017) 分类: 中国大学MOOC电子线路设计.测试与实验二网课答案 打开右 ...

  5. 电子线路设计技巧1:多电阻串联代替一个电阻

        从这篇日志开始对电子线路分类下的日志开始编号,本篇日志讲述为什么要用多个电阻代替一个电阻. 这几日项目遇到了一个问题,厂家给的参考电路,在电阻分压采样上不是直接使用1个电阻,而是使用多个电阻串 ...

  6. 电路与电子线路实验一万用表的设计与仿真——北京理工大学

    一.实验任务 1. 直流电流表 2. 直流电压表 3.交流电压表 4. 子电路 二.实验目的 1. 设计直流电流表模块 2. 设计直流电压表模块 3.交流电压表 4. 子电路 三.设计要求 1. I1 ...

  7. 电路与电子线路实验I(软件)——北京理工大学

    (第一部分) 实验1 叠加定理的验证 一.实验任务 完成叠加原理的验证. 二.实验原理  在多个独立电源.线性受控源和线性无源元件共同组成的线性电路中,某一支路的电压(或电流)等于每一个独立电源单独作 ...

  8. 电路与电子线路实验二-mutisim仿真实验——北京理工大学

    实验一 一.实验步骤 元器件的调用与参数设置 调用电阻Rg_1=400kΩ,Rg_2=200kΩ,  Rd=2kΩ,  Rs=0.5kΩ,  RL=2kΩ 电容C1=C2=C3=100μF 直流电压源 ...

  9. 电子线路设计技巧6:Boost电路的参数设计

    本文以实例方式介绍Boost电路的参数设计方法.项目需求:12V升压至50V,功率35W. 先看示例电路图,如下图所示. 在进行具体的参数计算之前,我们先简要的分析一下Boost电路的工作原理. 1. ...

最新文章

  1. 黑色星期五Friday the Thirteenth
  2. LIVE 预告 | TransGAN:丢弃卷积,纯Transformer构建GAN网络
  3. 寻找一个字符串中所有重复字符的索引
  4. Hadoop3.0 WordCount测试一直Accept 状态,Nodes of the cluster 页面node列表个数为0
  5. [Kaggle] Spam/Ham Email Classification 垃圾邮件分类(spacy)
  6. c++代码健壮性_复活Navex-使用图查询进行代码分析(上)
  7. oracle基础与应用
  8. linux 下解决arp病毒攻击时上网问题的最简单的治标办法
  9. c++ 宏 stdin 和 STDIN_FILENO 区别
  10. html批量转换ppt,将ppt批量转换成图片(一张幻灯片转成一张图片)
  11. 流程图设计(泳道图 | 任务流程图 | 页面流程图)
  12. 没所谓移动开发寒冬,不过是大鱼吃小鱼
  13. 解决git push报错问题
  14. 【云原生】SPL 提速天体聚类任务 2000 倍【文末送书】
  15. filebeat收集日志到elsticsearch中并使用ingest node的pipeline处理
  16. 记录一下解决win10无法分屏问题
  17. 小程序停止html5音乐,微信小程序API 音乐播放控制
  18. 开发web、app应用实战中用到的资料汇总
  19. 技术宅男买房记之建筑日照采光计算
  20. Android中禁止WebView滑动

热门文章

  1. 计算机专业好还是铁道运输管理好,铁道运输管理专业就业前景好原因公布!
  2. QT5.15.2静态编译MSVC2019
  3. 41岁中兴员工:这可能是我第5次失业
  4. 『WX运动』想上封面?就你那点步数怎么能行?点进来!老铁,借一步说话
  5. Windows10笔记本电脑重启时卡死不动的解决方案
  6. 使用 bitnami/postgresql-repmgr 镜像快速设置 PostgreSQL HA
  7. python练习题12:数据库基础
  8. 尚硅谷2020最新版宋红康JVM教程更新至中篇(java虚拟机详解,jvm从入门到精通)
  9. 流氓软件,你装了吗?
  10. 弹弹弹,多彩小球弹跳