目录

实验要求

源代码

顶层模块

数据输入模块

ALU运算模块

结果处理模块

扫描数码管模块

扫描数码管顶层

分频器

数码管显示

仿真代码

结构层图

管脚配置


实验板卡:xc7a100tlc sg324-2L,共20个开关

实验要求

通过高低位控制,实现32位数据A、B及运算方式的输入,通过8个数码管显示ALU的十六进制运算结果, 通过4个led灯显示4个运算信号ZF SF CF OF(判零、符号、进位、判溢)

源代码

顶层模块

`timescale 1ns / 1psmodule TOP(input CLK_100M,input[15:0] in_data,input ctrl_in,input rst_,input CLK_A,input CLK_B,input CLK_OP,input ShowA,input ShowB,output[7:0] AN,output[7:0] SEG,output[3:0] out_flags);wire[31:0] a;wire[31:0] b;wire[31:0] res;wire[31:0] alu_f;wire[3:0] in_flags;reg[31:0] out_data;DataInput A(in_data, ctrl_in, CLK_A, rst_, a);DataInput B(in_data, ctrl_in, CLK_B, rst_, b);  //数据输入ALU alu(a, b, in_data[3:0], res, in_flags);ALU_F f(res, in_flags, CLK_OP, rst_, alu_f, out_flags);LED led(CLK_100M, rst_, out_data, AN, SEG);always@(ShowA or ShowB)beginif(!ShowA)out_data = a;else if(!ShowB)out_data = b;elseout_data = alu_f;endendmodule

数据输入模块

`timescale 1ns / 1psmodule DataInput(input[15:0] data_in,input ctrl_in,input clk,input rst_,output reg[31:0] data_out);always@(negedge clk or negedge rst_)beginif(!rst_)data_out <= 32'b0;elsebeginif(ctrl_in == 1'b0)data_out[15:0] <= data_in;elsedata_out[31:16] <= data_in;endendendmodule

ALU运算模块

`timescale 1ns / 1psmodule ALU(input[31:0] a,input[31:0] b,input[31:0] op,output reg[32:0] res,output reg[3:0] flags);// flags: ZF    SF    CF   OF (高位->低位)//        判零  符号  进位  判溢always@(*)begincase(op)4'b0000:beginres <= a + b;flags[1] = res[32];flags[0] = a[31] ^ b[31] ^ res[31] ^ res[32];end4'b0001: res <= a << b;4'b0010: res <= ($signed(a) < $signed(b)) ? 1 : 0;4'b0011: res <= (a < b) ? 1 : 0;4'b0100: res <= a ^ b;4'b0101: res <= a >> b;4'b0110: res <= a | b;4'b0111: res <= a & b;4'b1000:beginres <= a - b;flags[1] = res[32];flags[0] = a[31] ^ b[31] ^ res[31] ^ res[32];end4'b1001: res <= $signed(a) >>> b;endcaseflags[3] = (res == 32'd0) ? 1 : 0;flags[2] = res[31];endendmodule

结果处理模块

`timescale 1ns / 1psmodule ALU_F(input[32:0] res,input[3:0] in_flags,input clk,input rst_,output reg[32:0] alu_f,output reg[3:0] out_flags);always@(negedge clk or negedge rst_)beginif(!rst_)beginalu_f <= 32'b0;out_flags <= 4'b1000;endelse if(clk)beginalu_f <= res;out_flags <= in_flags;endendendmodule

扫描数码管模块

扫描数码管顶层

`timescale 1ns / 1psmodule LED(input clk_100M,input rst_,input[31:0] data,output[7:0] AN,output[7:0] SEG
);wire clk_ref; //数码管刷新频率:500hzwire clk_inc; //数字刷新频率:10hzFdiv fdiv(clk_100M,32'd100000,clk_ref);Scanner scanner(data,rst_,clk_ref,AN,SEG);
endmodule

分频器

`timescale 1ns / 1psmodule Fdiv(input clk_in,input [31:0] count,output reg clk_out);reg[31:0] num;always@(posedge clk_in)beginif(num == count)beginclk_out <= ~clk_out;num <= 1'b0;endelsenum <= num + 1'b1;endendmodule

数码管显示

`timescale 1ns / 1psmodule Scanner(input[31:0] data,input rst_,input clk_ref,output reg[7:0] AN,output reg[7:0] SEG);
reg[3:0] data_x;
reg[2:0] bit;always@(negedge rst_ or posedge clk_ref)
beginif(!rst_)bit <= 3'd0;elsebit <= bit + 1'b1;
endalways@(*)begincase(bit)3'b000: begin AN <= 8'b1111_1110; data_x <= data[3:0]; end3'b001: begin AN <= 8'b1111_1101; data_x <= data[7:4]; end3'b010: begin AN <= 8'b1111_1011; data_x <= data[11:8]; end3'b011: begin AN <= 8'b1111_0111; data_x <= data[15:12]; end3'b100: begin AN <= 8'b1110_1111; data_x <= data[19:16]; end3'b101: begin AN <= 8'b1101_1111; data_x <= data[23:20]; end3'b110: begin AN <= 8'b1011_1111; data_x <= data[27:24]; end3'b111: begin AN <= 8'b0111_1111; data_x <= data[31:28]; endendcasecase(data_x)4'b0000: SEG <= 8'b0000_0011;4'b0001: SEG <= 8'b1001_1111;4'b0010: SEG <= 8'b0010_0101;4'b0011: SEG <= 8'b0000_1101;  4'b0100: SEG <= 8'b1001_1001;4'b0101: SEG <= 8'b0100_1001;4'b0110: SEG <= 8'b0100_0001;4'b0111: SEG <= 8'b0001_1111;4'b1000: SEG <= 8'b0000_0001;4'b1001: SEG <= 8'b0000_1001;4'b1010: SEG <= 8'b0001_0001;4'b1011: SEG <= 8'b1100_0001;4'b1100: SEG <= 8'b0110_0011;4'b1101: SEG <= 8'b1000_0101;4'b1110: SEG <= 8'b0110_0001;4'b1111: SEG <= 8'b0111_0001;endcaseend
endmodule

仿真代码

`timescale 1ns / 1psmodule ALU_top_sim();reg[31:0] a;reg[31:0] b;reg[3:0] op;wire[32:0] res;wire[3:0] flags; //顺序:ZF、SF、CF、OFinitialbegina = 32'h8000_0003;b = 32'h0000_0001;#100op = 4'b0000;   //加法#100op = 4'b0001;   //逻辑左移#100op = 4'b0010;   //有符号数比较          #100op = 4'b0011;   //无符号数比较            #100op = 4'b0100;   //异或#100op = 4'b0101;   //逻辑右移#100op = 4'b0110;   //按位或#100op = 4'b0111;   //按位与#100op = 4'b1000;   //减法#100op = 4'b1001;   //算术右移end    ALU alu_sim(a,b,op,res,flags);endmodule

结构层图

管脚配置

set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN E3} [get_ports CLK_100M]set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN V5} [get_ports in_data[15]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN T4} [get_ports in_data[14]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN V6} [get_ports in_data[13]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN T5} [get_ports in_data[12]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN T6} [get_ports in_data[11]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN V7} [get_ports in_data[10]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN R8} [get_ports in_data[9]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN U9} [get_ports in_data[8]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN T9} [get_ports in_data[7]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN V10} [get_ports in_data[6]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN R10} [get_ports in_data[5]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN U11} [get_ports in_data[4]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN R11} [get_ports in_data[3]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN U12} [get_ports in_data[2]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN T13} [get_ports in_data[1]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN V14} [get_ports in_data[0]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN T14} [get_ports ctrl_in]set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets rst_]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets CLK_A]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets CLK_B]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets CLK_OP]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN N17} [get_ports rst_]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN P18} [get_ports CLK_A]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN P17} [get_ports CLK_B]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN R18} [get_ports CLK_OP]set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets ShowA]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets ShowB]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN U18} [get_ports ShowA]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN U17} [get_ports ShowB]set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN U6} [get_ports out_flags[3]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN R5} [get_ports out_flags[2]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN U7} [get_ports out_flags[1]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN R6} [get_ports out_flags[0]]set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN C9} [get_ports AN[7]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN C10} [get_ports AN[6]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN D10} [get_ports AN[5]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN C11} [get_ports AN[4]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN M17} [get_ports AN[3]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN J14} [get_ports AN[2]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN K13} [get_ports AN[1]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN P14} [get_ports AN[0]]set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN F14} [get_ports SEG[7]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN N14} [get_ports SEG[6]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN J13} [get_ports SEG[5]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN G13} [get_ports SEG[4]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN F13} [get_ports SEG[3]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN G14} [get_ports SEG[2]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN M13} [get_ports SEG[1]]
set_property -dict {IOSTANDARD LVCMOS18 PACKAGE_PIN H14} [get_ports SEG[0]]

【FPGA】多功能ALU相关推荐

  1. 杭电 2016 计算机组成原理,杭电计算机组成原理多功能ALU设计实验

    <杭电计算机组成原理多功能ALU设计实验>由会员分享,可在线阅读,更多相关<杭电计算机组成原理多功能ALU设计实验(6页珍藏版)>请在人人文库网上搜索. 1.杭州电子科技大学计 ...

  2. FPGA多功能应用处理器

    FPGA多功能应用处理器 编解码加速卡 概述: 对于H.265/HEVC/VP9编解码处理,FPGA编解码加速卡方案有着完善的功能和preset配置,支持最多的有利于提高画质和降低bitrate的功能 ...

  3. FPGA引脚功能说明与分析

    FPGA引脚功能说明与分析 FPGA有很多个引脚,大多数为用户的IO口,有少量的IO作为特殊功能使用,下面以EP4CE10E22C8N芯片为例. VCCINT: 供电引脚.内核电压1.2V/5%,负责 ...

  4. 计算机组成原理alu_b什么意思,计算机组成原理实验三多功能ALU设计实验(5页)-原创力文档...

    实验报告 日 成绩: 课程名称 <计算机组成原理课程设计> 任课老师 曾虹 指导老师 曾虹 机位号 46 实验序号 实验名称 多功能ALU设计实验 实验时间 实验地点 1教 实验设备号 一 ...

  5. fpga在线升级 linux_以Flash控制器为核心的FPGA在线更新功能实现设计流程介绍

    0 引言 近些年来,由于其灵活可配置性及成本的降低,现场可编程门阵列(Field Programmable Gate Array,FPGA)在嵌入式系统中应用越来越广泛,不论产品的初期研发或是后期维护 ...

  6. FPGA–多功能密码锁 主控Xilinx-XC6SLX16 包含Veirlog源码和原理图

    FPGA–多功能密码锁 主控Xilinx-XC6SLX16,ISE软件. 功能描述:软件总体按模块可分为秒表模块.密码锁模块.呼吸灯模块.串口接收模块.串口发送模块 按键消抖模块.数码管显示模块. 模 ...

  7. 使用Verilog实现FPGA计数器功能

    本人地大14级师兄,如果有学弟学妹搜到这个评论一个呗! 一.设计要求 编写VerilogHDL程序,实现如下功能: 利用开发板上的数码显示译码器设计一个十进制计数器,要求该计数器具有以下功能: 1.计 ...

  8. FPGA之道(83)功能仿真之仿真语法(Graphic Waveform )

    文章目录 前言 仿真语法 Graphic Waveform 数字波形简介 从实际到仿真 实际系统检测 软件仿真模拟 "Hello world"之Graphic Waveform 待 ...

  9. FPGA之道(82)功能仿真之仿真原理

    文章目录 前言 功能仿真篇 仿真原理 串行模仿并行思路分析 有限模仿无限思路分析 组合逻辑仿真原理 时序逻辑仿真原理 HDL的仿真原理 仿真时间与物理时间 前言 本文摘自<FPGA之道>. ...

最新文章

  1. 实例解析linux内核I2C体系结构
  2. 测试规范包括哪些_光学会自动化测试还不够?还差最后这一步!
  3. SSIS中字符串转日期格式导入数据库
  4. 性能测试二十八:环境部署之Dubbo部署
  5. c++ 虚继承与继承的差异
  6. java equals 的区别_java中equals和==的区别是什么-百度经验
  7. 信息学奥赛一本通(1323:【例6.5】活动选择)
  8. 二次规划问题转换为半正定问题(QPtoSDP)
  9. Swift语法专题五——集合类型
  10. Office与Visio同事安装兼容问题
  11. 6park留园 android,‎App Store 上的“掌上留园-6park”
  12. 推荐一款轻量级的kafka管理平台:kafka-console-ui
  13. 【T-SQL基础】02.联接查询
  14. 开源 CMS系统 / SNS系统 / BBS系统
  15. 谷歌翻译用不了解决办法
  16. 【神经网络】激活函数的作用及常用激活函数
  17. oracle新建用户并授权视图
  18. DC/DC电源的延时计算
  19. 网上的名字测试打分软件准吗,王浩骅:不建议用网络软件测算名字
  20. (Modern Family S01E03) Part 5  PhilJay   Phil到Jay家和Jay玩toy airplane

热门文章

  1. Python PEP—Python增强提案
  2. 网上整理的google面试题
  3. 一位真正的好人却永远走了
  4. C++ - std::shared_ptr::get
  5. 步进电机与两线直流电机驱动
  6. 百度CEO李彦宏:2018年实现量产无人车
  7. amr转wav java,Android系统wav和amr的互转
  8. jq ajax xhrfields,为什么jQuery的.ajax()方法不发送会话cookie?
  9. python两台电脑文件传输_两行python代码实现一个http服务器,告别文件传输烦恼...
  10. 信息学奥赛一本通T1158