• 基于FPGA的ALU计算器verilog实现


    欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程

    目录

    一、理论基础

    二、核心程序

    三、测试结果


    一、理论基础

           Verilog HDL是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购)开发。两种HDL均为IEEE标准。

           Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。
           Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。
           Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。

    利用verilog语言设计微处理器的算术逻辑电路,对电路进行合理规划和尽可能的优化。

    (1) 能够完成16位有符号数的算术逻辑运算。

    (2)设计独立矩阵键盘和功能键,辅助完成功能验证。

    (3) 采用适当的形式显示结果。

    二、核心程序

    1. module keys(
    2. s0,//1
    3. s1,//2
    4. s2,//3
    5. s3,//+
    6. s4,//4
    7. s5,//5
    8. s6,//6
    9. s7,//-
    10. s8,//7
    11. s9,//8
    12. s10,//9
    13. s11,//*
    14. s12,//0
    15. s13,//=
    16. s14,//SIGN
    17. s15,///
    18. num,
    19. fadd,
    20. fsub,
    21. fmult,
    22. fdiv,
    23. fsig,
    24. fequ
    25. );
    26. input s0;
    27. input s1;
    28. input s2;
    29. input s3;
    30. input s4;
    31. input s5;
    32. input s6;
    33. input s7;
    34. input s8;
    35. input s9;
    36. input s10;
    37. input s11;
    38. input s12;
    39. input s13;
    40. input s14;
    41. input s15;
    42. output[3:0]num;
    43. output fadd;
    44. output fsub;
    45. output fmult;
    46. output fdiv;
    47. output fsig;
    48. output fequ;
    49. reg[3:0]num =4'b0000;
    50. reg fadd =1'b0;
    51. reg fsub =1'b0;
    52. reg fmult=1'b0;
    53. reg fdiv =1'b0;
    54. reg fsig =1'b0;
    55. reg fequ =1'b0;
    56. wire[15:0] control;
    57. assign control={s15,s14,s13,s12,s11,s10,s9,s8,s7,s6,s5,s4,s3,s2,s1,s0};
    58. always @(s0 or s1 or s2 or s3 or s4 or s5 or s6 or s7 or s8 or s9 or s10 or s11 or s12 or s13 or s14 or s15)
    59. begin
    60. case(control)
    61. 16'b0000_0000_0000_0001:begin
    62. num =4'd1;
    63. fadd =1'b0;
    64. fsub =1'b0;
    65. fmult=1'b0;
    66. fdiv =1'b0;
    67. fsig =1'b0;
    68. fequ =1'b0;
    69. end
    70. 16'b0000_0000_0000_0010:begin
    71. num =4'd2;
    72. fadd =1'b0;
    73. fsub =1'b0;
    74. fmult=1'b0;
    75. fdiv =1'b0;
    76. fsig =1'b0;
    77. fequ =1'b0;
    78. end
    79. 16'b0000_0000_0000_0100:begin
    80. num =4'd3;
    81. fadd =1'b0;
    82. fsub =1'b0;
    83. fmult=1'b0;
    84. fdiv =1'b0;
    85. fsig =1'b0;
    86. fequ =1'b0;
    87. end
    88. 16'b0000_0000_0000_1000:begin
    89. num =4'd0;
    90. fadd =1'b1;
    91. fsub =1'b0;
    92. fmult=1'b0;
    93. fdiv =1'b0;
    94. fsig =1'b0;
    95. fequ =1'b0;
    96. end
    97. 16'b0000_0000_0001_0000:begin
    98. num =4'd4;
    99. fadd =1'b0;
    100. fsub =1'b0;
    101. fmult=1'b0;
    102. fdiv =1'b0;
    103. fsig =1'b0;
    104. fequ =1'b0;
    105. end
    106. 16'b0000_0000_0010_0000:begin
    107. num =4'd5;
    108. fadd =1'b0;
    109. fsub =1'b0;
    110. fmult=1'b0;
    111. fdiv =1'b0;
    112. fsig =1'b0;
    113. fequ =1'b0;
    114. end
    115. 16'b0000_0000_0100_0000:begin
    116. num =4'd6;
    117. fadd =1'b0;
    118. fsub =1'b0;
    119. fmult=1'b0;
    120. fdiv =1'b0;
    121. fsig =1'b0;
    122. fequ =1'b0;
    123. end
    124. 16'b0000_0000_1000_0000:begin
    125. num =4'd0;
    126. fadd =1'b0;
    127. fsub =1'b1;
    128. fmult=1'b0;
    129. fdiv =1'b0;
    130. fsig =1'b0;
    131. fequ =1'b0;
    132. end
    133. 16'b0000_0001_0000_0000:begin
    134. num =4'd7;
    135. fadd =1'b0;
    136. fsub =1'b0;
    137. fmult=1'b0;
    138. fdiv =1'b0;
    139. fsig =1'b0;
    140. fequ =1'b0;
    141. end
    142. 16'b0000_0010_0000_0000:begin
    143. num =4'd8;
    144. fadd =1'b0;
    145. fsub =1'b0;
    146. fmult=1'b0;
    147. fdiv =1'b0;
    148. fsig =1'b0;
    149. fequ =1'b0;
    150. end
    151. 16'b0000_0100_0000_0000:begin
    152. num =4'd9;
    153. fadd =1'b0;
    154. fsub =1'b0;
    155. fmult=1'b0;
    156. fdiv =1'b0;
    157. fsig =1'b0;
    158. fequ =1'b0;
    159. end
    160. 16'b0000_1000_0000_0000:begin
    161. num =4'd0;
    162. fadd =1'b0;
    163. fsub =1'b0;
    164. fmult=1'b1;
    165. fdiv =1'b0;
    166. fsig =1'b0;
    167. fequ =1'b0;
    168. end
    169. 16'b0001_0000_0000_0000:begin
    170. num =4'd0;
    171. fadd =1'b0;
    172. fsub =1'b0;
    173. fmult=1'b0;
    174. fdiv =1'b0;
    175. fsig =1'b0;
    176. fequ =1'b0;
    177. end
    178. 16'b0010_0000_0000_0000:begin
    179. num =4'd0;
    180. fadd =1'b0;
    181. fsub =1'b0;
    182. fmult=1'b0;
    183. fdiv =1'b0;
    184. fsig =1'b0;
    185. fequ =1'b1;
    186. end
    187. 16'b0100_0000_0000_0000:begin
    188. num =4'd0;
    189. fadd =1'b0;
    190. fsub =1'b0;
    191. fmult=1'b0;
    192. fdiv =1'b0;
    193. fsig =1'b1;
    194. fequ =1'b0;
    195. end
    196. 16'b1000_0000_0000_0000:begin
    197. num =4'd0;
    198. fadd =1'b0;
    199. fsub =1'b0;
    200. fmult=1'b0;
    201. fdiv =1'b1;
    202. fsig =1'b0;
    203. fequ =1'b0;
    204. end
    205. default:begin
    206. num =4'd0;
    207. fadd =1'b0;
    208. fsub =1'b0;
    209. fmult=1'b0;
    210. fdiv =1'b0;
    211. fsig =1'b0;
    212. fequ =1'b0;
    213. end
    214. endcase
    215. end
    216. endmodule

    三、测试结果

    加法器的仿真:

    其效果如下所示:

    减法器的仿真:

    乘法器的仿真:

    除法器的仿真:

    以上是四个运算器的设计,下面要将其整合,得到ALU控制器。

    我们需要设计一个输入选择器用来识别我们输入的指令。

    这个就是ALU控制器的核心模块,下面要对外部接口进行设计。

    键盘我们在本系统设计的布局如下所示:

    1

    2

    3

    +

    4

    5

    6

    -

    7

    8

    9

    *

    0

    =

    Sign

    /

    这个是典型的矩阵键盘。

    0:1

    1:2

    2:3

    3:+

    4:4

    5:5

    6:6

    7:-

    8:7

    9:8

    10:9

    11:*

    12:0

    13:=

    14:sign

    15:/

    键盘的主要识别采用状态机来实现。

    状态1:输入第一个数字

    状态2:输入操作符号

    状态3:输入第二个数字

    状态4:等于

    A02-39

  • 相关阅读:
    [Spring]第七篇:日志框架和测试支持
    12-Hive的基本概念以及基本操作
    同步复位,异步复位,异步释放同步复位
    GB28181-流传输方式
    简单表达式的计算(两种方法)
    C++圆的面积与周长 自定义函数
    MST2101Q2 摩托车三相磁电机调压器控制芯片
    vue接口token认证登录(加手机验证)
    6月25日PMI认证考点防疫要求及考场安排
    docker安装(Elasticsearch、kibana、IK分词器)8.4.3
  • 原文地址:https://blog.csdn.net/ccsss22/article/details/128105977