Verilog 简易ALU
ALU设计
ALU模块:
//
//创建日期:2022/11/6 20:06:00
//设计名称:ALU算术逻辑单元
//课程名称:alu
//说明:
//输入: [11:0] alu_control; // ALU控制信号
// [31:0] alu_src1; // ALU操作数1
// [31:0] alu_src2; // ALU操作数2
//输出: [31:0] alu_result; // ALU结果
//依赖项:
//
//版次:
//版本0.01-文件已创建
//其他注释:
//
//
module alu(alu_control,alu_src1,alu_src2,alu_result);input [11:0] alu_control; // ALU控制信号input [31:0] alu_src1; // ALU操作数1input [31:0] alu_src2; // ALU操作数2output [31:0] alu_result; // ALU结果reg [31:0] alu_result;// 控制信号为独热编码always @(*)begincase(alu_control) // 下面的1,2指操作数1,操作数212'b000000000001:alu_result<=alu_src1<<16; // 高位加载 112'b000000000010:alu_result<=alu_src1>>>alu_src2; // 算术右移 212'b000000000100:alu_result<=alu_src1>>alu_src2; // 逻辑右移 412'b000000001000:alu_result<=alu_src1<<alu_src2; // 逻辑左移 812'b000000010000:alu_result<=alu_src1^alu_src2; // 按位异或 1612'b000000100000:alu_result<=alu_src1|alu_src2;// 按位或 3212'b000001000000:alu_result<=~(alu_src1|alu_src2); // 按位或非 6412'b000010000000:alu_result<=alu_src1&alu_src2; // 按位与 12812'b000100000000:alu_result<=alu_src1<alu_src2?32'd1:32'd0;// 无符号比较,小于置位 25612'b001000000000:alu_result<=$signed(alu_src1)<$signed(alu_src2)?32'd1:32'd0;// 有符号比较,小于置位 51212'b010000000000:alu_result<=alu_src1+alu_src2;// 1加 102412'b100000000000:alu_result<=alu_src1-alu_src2;// 1减 2048default: alu_result<=alu_src1;endcaseend
endmodule
alu_display.v
//*************************************************************************
// > 文件名: alu_display.v
// > 描述 :ALU显示模块,调用FPGA板上的IO接口和触摸屏
// > 作者 : LOONGSON
// > 日期 : 2016-04-14
//*************************************************************************
module alu_display(//时钟与复位信号input clk,input resetn, //后缀"n"代表低电平有效//拨码开关,用于选择输入数input [1:0] input_sel, //00:输入为控制信号(alu_control)//10:输入为源操作数1(alu_src1)//11:输入为源操作数2(alu_src2)//触摸屏相关接口,不需要更改output lcd_rst,output lcd_cs,output lcd_rs,output lcd_wr,output lcd_rd,inout[15:0] lcd_data_io,output lcd_bl_ctr,inout ct_int,inout ct_sda,output ct_scl,output ct_rstn);
//-----{调用ALU模块}beginreg [11:0] alu_control; // ALU控制信号reg [31:0] alu_src1; // ALU操作数1reg [31:0] alu_src2; // ALU操作数2wire [31:0] alu_result; // ALU结果alu alu_module(.alu_control(alu_control),.alu_src1 (alu_src1 ),.alu_src2 (alu_src2 ),.alu_result (alu_result ));
//-----{调用ALU模块}end//---------------------{调用触摸屏模块}begin--------------------//
//-----{实例化触摸屏}begin
//此小节不需要更改reg display_valid;reg [39:0] display_name;reg [31:0] display_value;wire [5 :0] display_number;wire input_valid;wire [31:0] input_value;lcd_module lcd_module(.clk (clk ), //10Mhz.resetn (resetn ),//调用触摸屏的接口.display_valid (display_valid ),.display_name (display_name ),.display_value (display_value ),.display_number (display_number),.input_valid (input_valid ),.input_value (input_value ),//lcd触摸屏相关接口,不需要更改.lcd_rst (lcd_rst ),.lcd_cs (lcd_cs ),.lcd_rs (lcd_rs ),.lcd_wr (lcd_wr ),.lcd_rd (lcd_rd ),.lcd_data_io (lcd_data_io ),.lcd_bl_ctr (lcd_bl_ctr ),.ct_int (ct_int ),.ct_sda (ct_sda ),.ct_scl (ct_scl ),.ct_rstn (ct_rstn ));
//-----{实例化触摸屏}end//-----{从触摸屏获取输入}begin
//根据实际需要输入的数修改此小节,
//建议对每一个数的输入,编写单独一个always块//当input_sel为00时,表示输入数控制信号,即alu_controlalways @(posedge clk)beginif (!resetn)beginalu_control <= 12'd0;endelse if (input_valid && input_sel==2'b00)beginalu_control <= input_value[11:0];endend//当input_sel为10时,表示输入数为源操作数1,即alu_src1always @(posedge clk)beginif (!resetn)beginalu_src1 <= 32'd0;endelse if (input_valid && input_sel==2'b10)beginalu_src1 <= input_value;endend//当input_sel为11时,表示输入数为源操作数2,即alu_src2always @(posedge clk)beginif (!resetn)beginalu_src2 <= 32'd0;endelse if (input_valid && input_sel==2'b11)beginalu_src2 <= input_value;endend
//-----{从触摸屏获取输入}end//-----{输出到触摸屏显示}begin
//根据需要显示的数修改此小节,
//触摸屏上共有44块显示区域,可显示44组32位数据
//44块显示区域从1开始编号,编号为1~44,always @(posedge clk)begincase(display_number)6'd1 :begindisplay_valid <= 1'b1;display_name <= "SRC_1";display_value <= alu_src1;end6'd2 :begindisplay_valid <= 1'b1;display_name <= "SRC_2";display_value <= alu_src2;end6'd3 :begindisplay_valid <= 1'b1;display_name <= "CONTR";display_value <={20'd0, alu_control};end6'd4 :begindisplay_valid <= 1'b1;display_name <= "RESUL";display_value <= alu_result;enddefault :begindisplay_valid <= 1'b0;display_name <= 40'd0;display_value <= 32'd0;endendcaseend
//-----{输出到触摸屏显示}end
//----------------------{调用触摸屏模块}end---------------------//
endmodule
tp仿真
`timescale 1ns / 1ps
module tb;reg [11:0] alu_control; // ALU控制信号reg [31:0] alu_src1; // ALU操作数1reg [31:0] alu_src2; // ALU操作数2wire [31:0] alu_result; // ALU结果alu alu_module(.alu_control(alu_control),.alu_src1 (alu_src1 ),.alu_src2 (alu_src2 ),.alu_result (alu_result ));initial beginalu_control=12'd0;alu_src1=32'd0;alu_src2=32'd0;#10;alu_control=12'b000000000001; // 1#10;alu_src1=32'd1024;#10;alu_src1=32'd512;#10;alu_src2=32'd64;#50;alu_control=12'b000000000010; // 2#10;alu_src2=32'd1024;#10;alu_src2=32'd512;#10;alu_src1=32'd64;#50;alu_control=12'b000000000100; // 4#10;alu_src1=32'd192;#10;alu_src2=32'd192;#10;alu_src2=32'd16;#50;alu_control=12'b000000001000; // 8#10;alu_src1=32'd192;#10;alu_src2=32'd192;#10;alu_src2=32'd16;#50;alu_control=12'b000000010000; // 16#10;alu_src1=32'd128;#10;alu_src2=32'd127;#10;alu_src2=32'd0;#50;alu_control=12'b000000100000; // 32#10;alu_src1=32'd128;#10;alu_src2=32'd127;#10;alu_src2=32'd0;#50;alu_control=12'b000001000000; // 64#10;alu_src1=32'hffffffff;#10;alu_src2=32'h1;#10;alu_src2=32'hffffffff;#50;alu_control=12'b000010000000; // 128#10;alu_src1=32'h0fffffff;#10;alu_src2=32'h1;#10;alu_src1=32'h0;#50;alu_control=12'b000100000000; // 256#10;alu_src1=32'hffffffff;alu_src2=32'd1;#10;alu_src2=32'd3;#10;alu_src2=32'd5;#50;alu_control=12'b001000000000; // 512#10;alu_src1=32'd1;#10;alu_src1=32'd3;alu_src2=32'hffffffff;#10;alu_src1=32'd5;#50;alu_control=12'b010000000000; // 1024#10;alu_src1=32'd1;#10;alu_src1=32'd2048;#10;alu_src1=32'hf0000000;#50;alu_control=12'b100000000000; // 2048#10;alu_src1=32'd1;#10;alu_src1=32'd2048;#10;alu_src1=32'hf0000000;end
endmodule
约束(COE2020)(板不一样的不要用这个约束)
#时钟信号连接
set_property PACKAGE_PIN AC19 [get_ports clk]#脉冲开关,用于输入作为复位信号,低电平有效
#set_property PACKAGE_PIN Y3 [get_ports resetn]
set_property PACKAGE_PIN AB21 [get_ports resetn]#拨码开关连接,用于输入,依次为sw0,sw1
#set_property PACKAGE_PIN AE20 [get_ports input_sel[0]]
set_property PACKAGE_PIN AE17 [get_ports input_sel[0]]
#set_property PACKAGE_PIN AD24 [get_ports input_sel[1]]
set_property PACKAGE_PIN AF17 [get_ports input_sel[1]]set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports resetn]
set_property IOSTANDARD LVCMOS33 [get_ports input_sel[1]]
set_property IOSTANDARD LVCMOS33 [get_ports input_sel[0]]#触摸屏引脚连接
#set_property PACKAGE_PIN J25 [get_ports lcd_rst]
#set_property PACKAGE_PIN H18 [get_ports lcd_cs]
#set_property PACKAGE_PIN K16 [get_ports lcd_rs]
#set_property PACKAGE_PIN L8 [get_ports lcd_wr]
#set_property PACKAGE_PIN K8 [get_ports lcd_rd]
#set_property PACKAGE_PIN J15 [get_ports lcd_bl_ctr]
#set_property PACKAGE_PIN H9 [get_ports {lcd_data_io[0]}]
#set_property PACKAGE_PIN K17 [get_ports {lcd_data_io[1]}]
#set_property PACKAGE_PIN J20 [get_ports {lcd_data_io[2]}]
#set_property PACKAGE_PIN M17 [get_ports {lcd_data_io[3]}]
#set_property PACKAGE_PIN L17 [get_ports {lcd_data_io[4]}]
#set_property PACKAGE_PIN L18 [get_ports {lcd_data_io[5]}]
#set_property PACKAGE_PIN L15 [get_ports {lcd_data_io[6]}]
#set_property PACKAGE_PIN M15 [get_ports {lcd_data_io[7]}]
#set_property PACKAGE_PIN M16 [get_ports {lcd_data_io[8]}]
#set_property PACKAGE_PIN L14 [get_ports {lcd_data_io[9]}]
#set_property PACKAGE_PIN M14 [get_ports {lcd_data_io[10]}]
#set_property PACKAGE_PIN F22 [get_ports {lcd_data_io[11]}]
#set_property PACKAGE_PIN G22 [get_ports {lcd_data_io[12]}]
#set_property PACKAGE_PIN G21 [get_ports {lcd_data_io[13]}]
#set_property PACKAGE_PIN H24 [get_ports {lcd_data_io[14]}]
#set_property PACKAGE_PIN J16 [get_ports {lcd_data_io[15]}]
#set_property PACKAGE_PIN L19 [get_ports ct_int]
#set_property PACKAGE_PIN J24 [get_ports ct_sda]
#set_property PACKAGE_PIN H21 [get_ports ct_scl]
#set_property PACKAGE_PIN G24 [get_ports ct_rstn]
set_property PACKAGE_PIN E5 [get_ports lcd_rst]
set_property PACKAGE_PIN G7 [get_ports lcd_cs]
set_property PACKAGE_PIN H7 [get_ports lcd_rs]
set_property PACKAGE_PIN E6 [get_ports lcd_wr]
set_property PACKAGE_PIN D5 [get_ports lcd_rd]
set_property PACKAGE_PIN J5 [get_ports lcd_bl_ctr]
set_property PACKAGE_PIN C4 [get_ports {lcd_data_io[0]}]
set_property PACKAGE_PIN C3 [get_ports {lcd_data_io[1]}]
set_property PACKAGE_PIN D4 [get_ports {lcd_data_io[2]}]
set_property PACKAGE_PIN D3 [get_ports {lcd_data_io[3]}]
set_property PACKAGE_PIN F5 [get_ports {lcd_data_io[4]}]
set_property PACKAGE_PIN G6 [get_ports {lcd_data_io[5]}]
set_property PACKAGE_PIN F4 [get_ports {lcd_data_io[6]}]
set_property PACKAGE_PIN E3 [get_ports {lcd_data_io[7]}]
set_property PACKAGE_PIN G5 [get_ports {lcd_data_io[8]}]
set_property PACKAGE_PIN H6 [get_ports {lcd_data_io[9]}]
set_property PACKAGE_PIN F2 [get_ports {lcd_data_io[10]}]
set_property PACKAGE_PIN F3 [get_ports {lcd_data_io[11]}]
set_property PACKAGE_PIN G4 [get_ports {lcd_data_io[12]}]
set_property PACKAGE_PIN G2 [get_ports {lcd_data_io[13]}]
set_property PACKAGE_PIN H4 [get_ports {lcd_data_io[14]}]
set_property PACKAGE_PIN H3 [get_ports {lcd_data_io[15]}]
set_property PACKAGE_PIN K6 [get_ports ct_int]
set_property PACKAGE_PIN J6 [get_ports ct_sda]
set_property PACKAGE_PIN L8 [get_ports ct_scl]
set_property PACKAGE_PIN K7 [get_ports ct_rstn]set_property IOSTANDARD LVCMOS33 [get_ports lcd_rst]
set_property IOSTANDARD LVCMOS33 [get_ports lcd_cs]
set_property IOSTANDARD LVCMOS33 [get_ports lcd_rs]
set_property IOSTANDARD LVCMOS33 [get_ports lcd_wr]
set_property IOSTANDARD LVCMOS33 [get_ports lcd_rd]
set_property IOSTANDARD LVCMOS33 [get_ports lcd_bl_ctr]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[8]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[9]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[10]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[11]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[12]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[13]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[14]}]
set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data_io[15]}]
set_property IOSTANDARD LVCMOS33 [get_ports ct_int]
set_property IOSTANDARD LVCMOS33 [get_ports ct_sda]
set_property IOSTANDARD LVCMOS33 [get_ports ct_scl]
set_property IOSTANDARD LVCMOS33 [get_ports ct_rstn]
Verilog 简易ALU相关推荐
- Verilog简易电梯控制系统(2层)
工程文件链接:Verilog简易电梯控制系统设计(两层,含附加项蜂鸣器和流水灯)-单片机文档类资源-CSDN下载 一.实验项目名称:简易电梯控制系统(2层) 二.实验学时:2 三.设计目标: 1.实 ...
- verilog简易密码锁设计
使用Verilog语言设计密码锁,在vivado下创建工程,并使用testbench在vivado下仿真,得到正确的结果.该密码锁具有设置密码的功能,当输入正确的密码时可以输出open信号,当错误时输 ...
- gvim for verilog简易配置
目录 前言 一.gvim的主题和字体资源 二.gvim编辑器基本配置 三.gvim针对verilog配置 总结 前言 分别介绍了gvim的主题和字体资源推荐,gvim编辑器基本配置和针对verilog ...
- Verilog 简易寄存器
目录 寄存器,长版 寄存器,简短版 仿真 tp 约束(COE2020)(板不一样的不要用这个约束) 寄存器,长版 // // //创建日期:2022/10/16 21:37:00 //设计名称:寄存器 ...
- 实验二 CPU 部件实现之 ALU 和寄存器堆
1.1设计要求 理解和掌握 CPU 中的算术逻辑运算部件(ALU)和寄存器堆(Register File)的工作原理,并使用 Verilog 和 ModelSim 进行设计和仿真. 1. 使用 Ver ...
- 【此后无良辰】实验二 CPU部件实现之ALU和寄存器堆
一. 实验目的 理解和掌握CPU中的算术逻辑运算部件(ALU)和寄存器堆(Register File)的工作原理,并使用Verilog和ModelSim进行设计和仿真. 二. 实验内容 使用Veril ...
- CPU部件实现之ALU、寄存器堆、PC、RAM
系统硬件综合设计-多周期CPU的设计与实现 计算机组成原理 实验五 单周期CPU设计与实现--十条指令CPU 文章目录 ALU和寄存器堆 一.实验目的: 二.实验内容: 三. 源代码 PC和半导体存储 ...
- Synopsys逻辑综合及DesignCompiler的使用
逻辑综合 一. 基础知识 逻辑综合的目的:决定电路门级结构.寻求时序(性能)和面积的平衡.寻求功耗与时序的平衡.增强电路的测试性. 二. 逻辑综合流程 Design Compiler使用 使用Desi ...
- FPGA数字系统设计(4)——行为级建模
行为级建模有两种标志性的结构: initial结构和always结构 initial结构与always结构在一个module可以出现很多次,与数据流建模assign一样. 一个module中所有的in ...
最新文章
- Jquery UI dialog 详解
- 一个详尽的面向 SAP UI5 初学者的教程 - 如何在 SAP UI5 中绘制图表 Chart
- TensorFlow 分布式
- 转自云界漫步:同步容灾100公里的限制来自哪里
- windows下文件系统格式介绍
- python教程-4.数据处理numpy-pandas
- 9款很棒的网页绘制图表JavaScript框架脚本
- Jenkins持续集成学习-搭建jenkins问题汇总
- dw中html颜色的设置颜色代码,利用Dreamweaver(DW)快速输入CSS颜色代码值
- 雷达初学者必读 | 毫米波雷达信号处理入门教程
- 项目成本管理的5项原则
- 软件项目管理 7.3.敏捷历时估算
- 赔97.6万元!腾讯一程序员违反竞业协议,三年白干了!
- DDD 实战 (11):冲刺 1 代码 TDD 实现之道
- SPSS(十七)SPSS之判别分析进阶(图文+数据集)
- 传奇服务器如何修改装备,架设传奇私服时怎样修改装备图标
- L1-027 出租 (20 分) java
- 从零玩转第三方登录之WeChat公众号登陆-cong-ling-wan-zhuan-di-san-fang-deng-lu-zhi-wechat-gong-zhong-hao-deng-lu...
- hjr-内梅罗综合指数法
- 15-当头炮攻屏风马--左马盘河局