【CPU设计实战】数字逻辑电路设计基础(一)
cpu设计中,需要遵守一些规定
- 禁止出现initial语句
- 禁止出现casex,casez
- 禁止使用#表达电路延迟
- 时钟信号clock只允许出现在always@(posedge clk)中
- 带复位的触发器,要么全都是
同步复位
,要么全都是异步复位
一些建议的代码风格
如果运算符两边的信号都是单比特,应该用“&”而不是“&&”,“|”而不是“||”
表示逻辑关系时,用“&&”和“||”
表示逻辑门时,如先行进位加法器的先行进位生成逻辑、乘法器里的华莱士树,那么用“|”和“&”
实践任务一:寄存器堆仿真
regfine.v
module regfile(input clk,input [ 4:0] raddr1,output [31:0] rdata1,input [ 4:0] raddr2,output [31:0] rdata2,input we,input [ 4:0] waddr,input [31:0] wdata
);
reg [31:0] rf[31:0];
// WRITE
always @(posedge clk) beginif (we) rf[waddr]<= wdata;//如果写使能 将数据写入对应的寄存器
end
// READ OUT 1
assign rdata1 = (raddr1==5'b0) ? 32'b0 : rf[raddr1];//根据寄存器地址 读出相应寄存器中的值
// READ OUT 2
assign rdata2 = (raddr2==5'b0) ? 32'b0 : rf[raddr2];
endmodule
rf_tb.v
`timescale 1ns / 1psmodule tb_top();reg clk;reg [ 4:0] raddr1;
wire [31:0] rdata1;
reg [ 4:0] raddr2;
wire [31:0] rdata2;
reg we;
reg [ 4:0] waddr;
reg [31:0] wdata;reg [ 3:0] task_phase;regfile regfile0(.clk (clk ),.raddr1 (raddr1 ),.rdata1 (rdata1 ),.raddr2 (raddr2 ),.rdata2 (rdata2 ),.we (we ),.waddr (waddr ),.wdata (wdata )
);//clk
initial
beginclk = 1'b1;
end
always #5 clk = ~clk;initial
beginraddr1 = 5'd0;raddr2 = 5'd0;waddr = 5'd0;wdata = 32'd0;we = 1'd0;task_phase = 4'd0;#2000;$display("=============================");$display("Test Begin");#1;// Part 0 Begin#10;task_phase = 4'd0;we = 1'b0;waddr = 5'd1;wdata = 32'hffffffff;raddr1 = 5'd1;#10;we = 1'b1;waddr = 5'd1;wdata = 32'h1111ffff;#10;we = 1'b0;raddr1 = 5'd2;raddr2 = 5'd1;#10;raddr1 = 5'd1;#200;// Part 1 Begin#10;task_phase = 4'd1;we = 1'b1;wdata = 32'h0000ffff;waddr = 5'h10;raddr1 = 5'h10;raddr2 = 5'h0f;#10;wdata = 32'h1111ffff;waddr = 5'h11;raddr1 = 5'h11;raddr2 = 5'h10;#10;wdata = 32'h2222ffff;waddr = 5'h12;raddr1 = 5'h12;raddr2 = 5'h11;#10;wdata = 32'h3333ffff;waddr = 5'h13;raddr1 = 5'h13;raddr2 = 5'h12;#10;wdata = 32'h4444ffff;waddr = 5'h14;raddr1 = 5'h14;raddr2 = 5'h13;#10;raddr1 = 5'h15;raddr2 = 5'h14;#10;#200;// Part 2 Begin#10;task_phase = 4'd2;we = 1'b1;raddr1 = 5'h10;raddr2 = 5'h0f;#10;raddr1 = 5'h11;raddr2 = 5'h10;#10;raddr1 = 5'h12;raddr2 = 5'h11;#10;raddr1 = 5'h13;raddr2 = 5'h12;#10;raddr1 = 5'h14;raddr2 = 5'h13;#10;#50;$display("TEST END");$finish;
endendmodule
仿真
实践任务二:同步RAM和异步RAM仿真、综合与实现
为同步RAM、异步RAM各建一个工程,调用IP实例化同步RAM,异步RAM。
同步
module ram_top (input clk ,input [15:0] ram_addr ,input [31:0] ram_wdata,input ram_wen ,output [31:0] ram_rdata
);block_ram block_ram (.clka (clk ),.wea (ram_wen ),.addra(ram_addr ),.dina (ram_wdata ),.douta(ram_rdata )
);
endmodule
异步
module ram_top (input clk ,input [15:0] ram_addr ,input [31:0] ram_wdata,input ram_wen ,output [31:0] ram_rdata
);distributed_ram distributed_ram(.clk (clk ),.we (ram_wen ),.a (ram_addr ),.d (ram_wdata ),.spo (ram_rdata )
);endmodule
测试
`timescale 1ns / 1psmodule tb_top();reg clk;reg ram_wen;
reg [15:0] ram_addr;
reg [31:0] ram_wdata;
wire [31:0] ram_rdata;
reg [3 :0] task_phase;ram_top u_ram_top(.clk (clk ),.ram_wen (ram_wen ),.ram_addr (ram_addr ),.ram_wdata(ram_wdata ),.ram_rdata(ram_rdata )
);//clk
initial
beginclk = 1'b1;
end
always #5 clk = ~clk;initial
beginram_addr = 16'd0;ram_wdata = 32'd0;ram_wen = 1'd0;task_phase = 4'd0;#2000;$display("=============================");$display("Test Begin");#1;// Part 0 Begin#10;task_phase = 4'd0;ram_wen = 1'b0;ram_addr = 16'hf0;ram_wdata = 32'hffffffff;#10;ram_wen = 1'b1;ram_addr = 16'hf0;ram_wdata = 32'h11223344;#10;ram_wen = 1'b0;ram_addr = 16'hf1;#10;ram_wen = 1'b0;ram_addr = 16'hf0;#200;// Part 1 Begin#10;task_phase = 4'd1;ram_wen = 1'b1;ram_wdata = 32'hff00;ram_addr = 16'hf0;#10;ram_wdata = 32'hff11;ram_addr = 16'hf1;#10;ram_wdata = 32'hff22;ram_addr = 16'hf2;#10;ram_wdata = 32'hff33;ram_addr = 16'hf3;#10;ram_wdata = 32'hff44;ram_addr = 16'hf4;#10;#200;// Part 2 Begin#10;task_phase = 4'd2;ram_wen = 1'b0;ram_addr = 16'hf0;ram_wdata = 32'hffffffff;#10;ram_addr = 16'hf1;#10;ram_addr = 16'hf2;#10;ram_addr = 16'hf3;#10;ram_addr = 16'hf4;#10;#50;$display("TEST END");$finish;
endendmodule
仿真 (确实不一样的)
上面四张是异步 下面四张是同步 具体现在我也不知道为什么。。。。。。。。。。。。。。
【CPU设计实战】数字逻辑电路设计基础(一)相关推荐
- CPU设计实战 第5章 实践任务
CPU设计实战-汪文祥 邢金璋 第5章 实践任务一 实验环境 lab6.zip 文章目录 前言 一.实验内容 前言 在lab5的实验环境下,添加算术逻辑运算类指令,乘除运算类指令,以及乘数法配套的数据 ...
- 在VIVADO上实现的非常简易的RISC-V CPU设计(来自《Verilog数字系统设计》夏宇闻著)
在VIVADO上实现的非常简易的RISC-V CPU设计 一.实验要求重述: 1.实验目的 2.实验要求: 二.学习准备: 1.什么cpu? 2.cpu需要具有哪些部件? 3.什么是RISC_CPU? ...
- 数字逻辑电路与系统 课程设计:基于FPGA的乒乓球游戏
设计目的 使用FPGA实验班设计一个数字逻辑系统,巩固数字逻辑电路的相关知识,锻炼熟练使用FPGA设计软件和硬件和独立完成项目设计的能力. 二.设计内容 2.1摘要 设计一个乒乓球游戏,实现游戏功能和 ...
- 【Computer Organization笔记10】单周期CPU设计:基于7条MIPS指令的数据通路
本次笔记内容: P19 计算机组成原理(19) P20 计算机组成原理(20) 本节课对应幻灯片: 组成原理24 singlecycle.pptx 基于上节课的7条MIPS指令的数据通路,分别针对7条 ...
- Verilog流水线CPU设计(超详细)
上篇:Verilog单周期CPU设计(超详细) 本篇完整工程下载链接,已于19.12.17更新 实验 流水线CPU 一.设计目的与要求 1.1 实验内容 1.2 实验要求 1.3 实验创新 二.课程设 ...
- 8位CPU设计(1) 门电路和锁存器、触发器
转载请注明出处:https://blog.csdn.net/Leytton/article/details/90761305 一.导言 在这篇文章里,我将给大家介绍一些门电路基础知识,并利用门电路,搭 ...
- 大二c语言数电课程设计,数电课程设计报告(数字钟的设计).doc
数电课程设计报告(数字钟的设计).doc 数电课程设计报告 设计背景与要求 设计要求 系统概述 2.1设计思想与方案选择 2.2各功能块的组成 2.3工作原理 第三章 单元电路设计与分析 3.1各单元 ...
- 记录---Testin上新手测试用例设计实战---碎乐3.2.0
记录---Testin上新手测试用例设计实战---碎乐3.2.0 平台上给的版本是碎乐3.12版的,但是平台上给的安装包下载不了,所以加群咨询之后给出了直接去手机应用商店下载搜索到的版本的对策.所以就 ...
- (Verilog)多周期CPU设计
(Verilog)多周期CPU设计 写在前面:在参考别人的博客自己做了一遍单周期cpu后,觉得不是很难,于是自己尝试了做一下多周期cpu,然后被各种bug糊脸...果然,自己尝试和有大佬指路还是有很大 ...
最新文章
- [k8s] 第五章 Pod详解
- [Hive_11] Hive 的高级聚合函数
- STL中各容器和适配器类的定义
- 虚拟机克隆Linux操作系统后解决MAC地址冲突
- 【机器视觉】 dev_unmap_prog算子
- 是什么故障码_大众途观报P2187、P0101故障,差点就换发动机了
- arima模型_[不说人话系列]-ARIMA模型
- 触摸传感器的电路图符号_如何看懂汽车电路常用图形符号,看完这篇文章就懂了...
- Spring MVC 3.2+ @ResponseBody 导致的中文乱码处理
- T3 登陆报错 3709
- 小米平板2刷哪个系统更流畅_小米平板2刷lineage os与remix os及其体验
- 蓝桥web模拟赛:时间管理大师
- 计算机无法自动搜索更新驱动程序,Win10怎么设置自动搜索更新驱动软件
- 普中科技单片机AD电压数模转换。STC89C52和XPT2046 芯片
- android开发,如何给app授予系统权限
- 带农历日历的DatePicker控件!Xamarin控件开发小记
- Spring Cloud源码阅读(一)
- mysql增加字段 first_MySQL教程41-MySQL数据表添加字段
- matlab示波器横轴变纵轴,excel表格横轴数据变纵轴-在EXCEL中做图表,横坐标和纵坐标如何调换?...
- 前端的岗位以及初步了解