https://mp.weixin.qq.com/s/jLUz757FQZjMEYzYb2AIww

 
MOS6502是简单,但是曾经相当流行的一款CPU。网上有很多模拟程序可供学习使用。这里使用一个较为精简的Verilog项目,介绍MOS6502这款CPU的运行机制,然后使用jchdl进行模拟。
 
参考项目:https://github.com/Arlet/verilog-6502
该项目只包含两个文件:alu.v, cpu.v。这里首先介绍alu.v。
 
 
1. 注释部分简介了ALU的主要功能,根据op的不同,对AI/BI进行运算。
 
2. 输入输出接口
 
需要关注的有时钟(clk), 操作类型(op),运算数和进位输入(AI, BI, CI),运算结果和进位输出(OUT, CO),标志位输出(V, Z, N, HC)等
 
3. 内部变量
 
4. 计算逻辑运算的结果
 
op是经过精心设计的,如果op[1:0]等于2'b11,则alu执行AI和BI的加减运算:
此时temp_logic中保存运算数AI,以期参与后续运算。
 
相反的,op[1:0]的另外集中组合,则temp_logic中直接存放逻辑运算结果。这几种情况下,op[3:2]都为2'b11,不存在其他情况。
 
5. 计算算术运算结果
当op[3:2]为2'b11时,temp_logic中已经是逻辑运算结果了,所以无需temp_BI参加运算,故而直接置零。
 
当op[3:2]为其他值时,则temp_BI缓存BI的值。根据op的设计,此种情况下,op[1:0]的值为2'b11, temp_logic中保存的是AI。
  1. A+B: temp_BI直接缓存BI的值,后续参与运算。
  1. A-B:减法运算需要对BI求2的补码,即取反加一,这里先行取反。
  1. A+A:temp_BI缓存temp_logic的值,此时temp_logic中存的是AI的值,所以是A+A。
 
6. 计算运算结果
这里把temp_logic和temp_BI相加,计算最终结果。
 
需要指出的是,当运算为A - B时,需要对BI取反加一以求补码。上面只进行了取反,而没有加一,所以要加的1只能来自于adder_CI。adder_CI来自于输入CI:
 
也没有表明当为减法是,adder_CI或CI为1。查询MOS6502文档之后得知,MOS6502若要执行减法,需要先执行一条把进位置1的指令。
 
7. 更新进位
 
8. BCD的运算
MOS6502可以把AI, BI当成BCD格式(每四位表示一位十进制数)进行运算,并输出BCD格式的数字到OUT中。
BCD运算与二进制运算的区别,主要体现在进位上:
 
temp_l[3:1]大于等于5,即代表temp_l[3:0]大于等于10,在BCD格式下,需要进位。
 
其他部分这里不做解释。
 

jchdl - RTL实例 - MOS6502 ALU (Verilog)的更多相关文章

  1. jchdl - RTL实例 - MOS6502 ALU

    https://mp.weixin.qq.com/s/nMxYVC2djk7DdAforerZPA   使用jchdl RTL实现MOS6502 CPU的ALU.   参考链接 https://git ...

  2. jchdl - RTL实例 - MOS6502 SoC

    https://mp.weixin.qq.com/s/H2UBmZa9fpM6_FM2_MucTQ   实现一个SoC作为顶层模块,包含Cpu.Mem两个子模块,并驱动运行.   参考链接 https ...

  3. jchdl - RTL实例 - MOS6502 CPU

    https://mp.weixin.qq.com/s/OguQKMU64GGdinCJjgyeKw   实现MOS6502 CPU,主要是实现状态机.   参考链接 https://github.co ...

  4. jchdl - RTL实例 - MOS6502 Mem

    https://mp.weixin.qq.com/s/ST8q-VWOT47kcYg10-4AQw   实现一个简单的内存模块,匹配MOS6502 CPU使用.   参考链接 https://gith ...

  5. jchdl - RTL实例 - Counter4

    https://mp.weixin.qq.com/s/xtvMj5f-Uvx3vesVnH0P_A   计数器.   参考链接 https://github.com/wjcdx/jchdl/blob/ ...

  6. jchdl - RTL实例 - Adder

    https://mp.weixin.qq.com/s/9S29BCTcJfbpR62ALjSidA   加法器.   参考链接 https://github.com/wjcdx/jchdl/blob/ ...

  7. jchdl - RTL实例 - Mux

    https://mp.weixin.qq.com/s/OmQRQU2mU2I5d-qtV4PAwg   二选一输出.   参考链接 https://github.com/wjcdx/jchdl/blo ...

  8. jchdl - RTL实例 - AndReg

    https://mp.weixin.qq.com/s/p4-379tBRYKCYBk8AZoT8A   输入两组线相与,结果输出到寄存器.   参考链接 https://github.com/wjcd ...

  9. jchdl - RTL实例 - AndAnd

    https://mp.weixin.qq.com/s/JhUB3M1WhjAyUrN1HPIPTA   AndAnd是三输入与门模块,输出为相与的结果.   参考链接 https://github.c ...

随机推荐

  1. P4016 负载平衡问题 网络流重温

    P4016 负载平衡问题 这个题目现在第二次做,感觉没有这么简单,可能是我太久没有写这种题目了,基本上都忘记了,所以我连这个是费用流都没有看出来. 有点小伤心,知道是费用流之后,我居然还拆点了. 这个 ...

  2. spring mvc实现转发和重定向

    转发:服务器端请求的跳转 同一个请求之内 重定向:客户端请求的跳转 两次请求 转发和重定向的区别: 1,转发地址栏不会发生变化,重定向地址栏会发生变化. 2,转发请求的参数不会丢失 重定向参数会丢失. ...

  3. 13_JavaScript基础入门(3)

    条件分支语句 条件分支语句,也叫作条件判断语句,就是根据某种条件执行某些语句,不执行某些语句. JS中有三种语法是可以表示条件分支的. 1.if--else-- 条件分支的主力语法,这个主力语法能够书 ...

  4. c语言中的malloc函数

    少壮不努力,大一的时候c语言学得不扎实,最近学数据结构的时候看到c语言中malloc函数都不知道了,这里记录一下,避免以后再忘. malloc的全称是memory allocation,中文叫动态内存 ...

  5. .NETcore中使用jwt来对api进行身份验证

    对于 登陆,身份,授权这之类的操作,我们最常用的几种方法无非就是 cookie session token 这三者的差别 https://www.cnblogs.com/moyand/p/904797 ...

  6. [POJ1038]状压DP

    题意:给一个n*m的区域,里面有一些障碍物,往里面放2*3和3*2的矩形,矩形之间不能重叠,不能覆盖到障碍物,求能放置的最大个数.(n<=150,m<=10) 思路:看到m=10就应该往状 ...

  7. ReactNative报错:Can't find variable: __fbBatchedBridge

    最近开始研究ReactNative,首先根据网上教程 http://www.codeceo.com/article/windows-react-native-android.html 一步一步来.完成 ...

  8. 力扣题解-560. 和为K的子数组

    题目描述 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 1 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1] ...

  9. eclipse导入工程报错-项目或者文件有红叉的解决方案

    1.Java的JDK或者Tomcat版本不一致 像这样的我们首先找到项目---->Build Path--->Config BuildPath,将找不到的JDK或者Tomcat进行删除和添 ...

  10. PAT 1015 Reversible Primes (20分) 谜一般的题目,不就是个进制转换+素数判断

    题目 A reversible prime in any number system is a prime whose "reverse" in that number syste ...