用verilog编写16位加法器 乘法器 自动售货机
verilog自动售货机资料
齐齐哈尔大学SOPC课程设计(论文)题目:饮料自动提取机的设计院(系):通信与电子工程学院专业班级:电子091学号: **********学生姓名:**指导教师:**起止时间:2011.12.19-2011.12.30摘要饮料自动售货机是台机电一体化的自动化装置,再接收到货币已输入的前提下,靠触摸控制按钮输入信号使控制器启动相关位置的机械装置完成规定动作,将货物输出。
当顾客按下需要买的商品所对应的按键时,数码管上显示出该商品的的价格,然后顾客需要将货币投入投币口,数码管上显示出所投币额。
当按下确认键,则自动售货机将对投入的货币与商品的价格进行比较。
如果投入的币额足够时,则自动送出商品,并且把多余的钱找回,在数码管上显示出来。
本课程设计设想采用专用集成电路芯片实现饮料自动提取机的功能。
在本次设计中,系统开发平台为Quarter2,硬件描述语言是VerilogHDL。
设计方案中,售货机具备硬币识别及找零功能,并能完成四种商品的出售。
依据设计方案和设计平台完成了程序编写和程序调试,通过运行程序及时序波形的仿真有效验证了设计的正确性,初步实现了设计目标。
关键词: 自动售货机 VerilogHDL QuarterⅡ目录第1章绪论 (1)1.1饮料自动提取机概况 (1)1.2本文研究内容 (2)1.3目的与意义 (2)第2章系统设计方案 (3)2.1饮料自动提取机总体设计方案 (3)2.2系统的参数 (4)第3章饮料自动提取机的基本原理 (5)3.1饮料自动提取机功能 (5)3.2饮料自动提取机的基本组成 (5)3.2.1 投币信号产生的设计 (5)3.2.2 时钟电路的设计 (5)3.2.3 数码显示的设计 (6)第4章饮料自动提取机软件设计 (7)4.1软件实现功能综述 (7)4.2计数功能的设计 (7)4.2.1 计数功能接口电路 (7)4.2.2 计数功能程序设计 (7)4.3投币功能的设计 (8)4.3.1 投币功能的接口电路 (8)4.3.2 投币功能程序设计 (8)4.4显示功能的设计 (9)4.4.1 显示功能的接口电路 (9)4.4.2 显示功能程序设计 (9)4.5显示功能的设计 (12)4.5.1 显示功能的接口电路 (12)4.5.2 显示功能程序设计 (12)第5章饮料自动提取机系统的仿真分析 (14)5.1系统原理图 (14)5.2计数功能的仿真分析 (14)5.3投币功能的仿真分析 (15)5.4取货功能的仿真分析 (15)5.5总体功能的仿真分析 (16)第6章课程设计总结 (18)参考文献 (19)第1章绪论1.1饮料自动提取机概况近年来,集成电路技术的迅猛发展,特别是可编程逻辑器件的高速发展,电子设计自动化EDA技术成为电子设计工程师的新宠。
verilog设计 自动售货机
自动售货机1、设计说明本设计是以现场可编程逻辑器件(FPGA)为核心的自动售货机,利用Modesim 软件编写verilog硬件描述语言程序以实现自动售货功能。
1.1、系统设计描述(1)用四个发光二极管分别模拟售出价值为2元、5元、7元和10元的商品,购买者可以通过开关选择任意一种标价中的小商品;(2)灯亮时表示该小商品售出;(3)用开关分别模拟1元、5元,10元和20元货币投入,用四支发光二极管代表投入的货币的面值;(4)每次只能售出一种小商品,当所投硬币达到或超过购买者所选面值时,售出货物并找回剩余的硬币,回到初始状态;(5)当所投硬币值不足面值时,可通过一个复位键退回所投硬币,回到初始状态。
系统框图如图1.1所示:图1.1 系统框图2、详细状态描述2.1 初始状态rst为复位键,低电平有效,实现系统复位。
2.2 选商品状态分别有价格为2元、5元、7元和10元的商品,每次选择商品前,设置一个标志位btn_sel_goods表示选择商品状态。
此自动售货机每一次售货时只能一次选择一种商品,当同时选择两种以上时,选择商品无效,数码管显示清零,重新进行商品选择。
选择商品后,数码管显示所选商品价格。
2.3 投币状态当选好商品后,开始投币。
同样有一标志位btn_price表示投币金额。
投币口只接受面值为1元、5元10元和20元的货币,可以同时投入多种面值钱币。
投完币后,先有一个确认买商品的过程,若投了币但又不购买商品了,就将全部投币金额退回;若确认购买商品,则进入下一状态。
2.4 找零状态投完币,并确认购买商品后,进入找零状态。
首先要将所投的金额与所选商品的价格做比较,若所投金额小于商品价格,则退回所投钱币;若大于等于商品价格,则两者做差,得到需要找零的钱。
3、仿真结果分析设置测试程序各参数,运行tb文件,仿真结果如下图3.1、3.2所示。
图3.1图3.1所示,商品价格选择为7元,即btn_sel_goods=2'b10,投币总额大于商品价格的情况,上图中btn_mony从右到左依次代表投币1元、10元、20元、10元、20元、1元、20元和10元,共92元。
乘法器的verilog实现(并行、移位相加、查找表)
乘法器的verilog实现(并⾏、移位相加、查找表)并⾏乘法器,也就是⽤乘法运算符实现,下⾯的代码实现8bit⽆符号数的乘法。
代码:1module mult_parrell(rst_n,2 clk,3 a,4 b,5 p6 );7parameter DATA_SIZE = 8;89input rst_n;10input clk;11input [DATA_SIZE - 1 : 0] a;12input [DATA_SIZE - 1 : 0] b;1314output [2*DATA_SIZE - 1 : 0] p;1516reg [DATA_SIZE - 1 : 0] a_r;17reg [DATA_SIZE - 1 : 0] b_r;1819wire [2*DATA_SIZE - 1 : 0] p_tmp;20reg [2*DATA_SIZE - 1 : 0] p;2122//输⼊数据打⼀拍23always@(posedge clk)24if(!rst_n)25begin26 a_r <= 8'd0;27 b_r <= 8'd0;28end29else30begin31 a_r <= a;32 b_r <= b;33end3435assign p_tmp = a*b; //只能做⽆符号数的相乘,若要做有符号数乘法,需将数据声明为signed类型3637//输出数据打⼀拍38always@(posedge clk)39if(!rst_n)40begin41 p <= 16'd0;42end43else44begin45 p <= p_tmp;46end4748endmodule移位相加乘法器,下⾯的代码可实现8bit有符号数的相乘,注意符号扩展以及MSB位的处理://输⼊数据取反assign a_r_inv = ~a_r + 1;assign a_shift0 = b_r[0] ? {{8{a_r[7]}},a_r} : 0;assign a_shift1 = b_r[1] ? {{7{a_r[7]}},a_r,1'b0} : 0;assign a_shift2 = b_r[2] ? {{6{a_r[7]}},a_r,2'b0} : 0;assign a_shift3 = b_r[3] ? {{5{a_r[7]}},a_r,3'b0} : 0;assign a_shift4 = b_r[4] ? {{4{a_r[7]}},a_r,4'b0} : 0;assign a_shift5 = b_r[5] ? {{3{a_r[7]}},a_r,5'b0} : 0;assign a_shift6 = b_r[6] ? {{2{a_r[7]}},a_r,6'b0} : 0;assign a_shift7 = b_r[7] ? {{1{a_r_inv[7]}},a_r_inv,7'b0} : 0; //被乘数为⽆符号数时,特别处理代码:1module mult_shift_add(rst_n,2 clk,3 a,4 b,5 p6 );7parameter DATA_SIZE = 8;89input rst_n;10input clk;11input [DATA_SIZE - 1 : 0] a;12input [DATA_SIZE - 1 : 0] b;1314output [2*DATA_SIZE - 2 : 0] p;1516//输⼊数据打⼀个时钟节拍17reg [DATA_SIZE - 1 : 0] a_r;18reg [DATA_SIZE - 1 : 0] b_r;1920//输⼊数据取反21wire [DATA_SIZE - 1 : 0] a_r_inv;2223//输⼊数据移位24wire [2*DATA_SIZE - 1 : 0] a_shift0;25wire [2*DATA_SIZE - 1 : 0] a_shift1;26wire [2*DATA_SIZE - 1 : 0] a_shift2;27wire [2*DATA_SIZE - 1 : 0] a_shift3;28wire [2*DATA_SIZE - 1 : 0] a_shift4;29wire [2*DATA_SIZE - 1 : 0] a_shift5;30wire [2*DATA_SIZE - 1 : 0] a_shift6;31wire [2*DATA_SIZE - 1 : 0] a_shift7;3233//输出数据打⼀个时钟节拍34wire [2*DATA_SIZE - 1 : 0] p_tmp;35reg [2*DATA_SIZE - 1 : 0] p;3637//输⼊数据打⼀个时钟节拍38always@(posedge clk)39if(!rst_n)40begin41 a_r <= 8'd0;42 b_r <= 8'd0;43end44else45begin46 a_r <= a;47 b_r <= b;48end49//输⼊数据取反50assign a_r_inv = ~a_r + 1;5152//输⼊数据移位,注意符号扩展,不仅仅是最⾼位扩展53//对每⼀个bit都需扩展54assign a_shift0 = b_r[0] ? {{8{a_r[7]}},a_r} : 0;55assign a_shift1 = b_r[1] ? {{7{a_r[7]}},a_r,1'b0} : 0;56assign a_shift2 = b_r[2] ? {{6{a_r[7]}},a_r,2'b0} : 0;57assign a_shift3 = b_r[3] ? {{5{a_r[7]}},a_r,3'b0} : 0;58assign a_shift4 = b_r[4] ? {{4{a_r[7]}},a_r,4'b0} : 0;59assign a_shift5 = b_r[5] ? {{3{a_r[7]}},a_r,5'b0} : 0;60assign a_shift6 = b_r[6] ? {{2{a_r[7]}},a_r,6'b0} : 0;61assign a_shift7 = b_r[7] ? {{1{a_r_inv[7]}},a_r_inv,7'b0} : 0; //被乘数为⽆符号数时,特别处理6263assign p_tmp = a_shift0 + a_shift1 + a_shift2 + a_shift3 + a_shift464 + a_shift5 + a_shift6 + a_shift7;6566always@(posedge clk)67if(!rst_n)68begin69//p <= 16'd0;70 p <= 15'd0;71end72else73begin74//p <= p_tmp[15:0];75 p <= p_tmp[14:0];76end7778endmoduletestbench:1module mult_shift_add_tb;23// Inputs4reg rst_n;5reg clk;6reg [7:0] a;7reg [7:0] b;89// Outputs10wire [14:0] p;1112// Instantiate the Unit Under Test (UUT)13 mult_shift_add uut (14 .rst_n(rst_n),15 .clk(clk),16 .a(a),17 .b(b),18 .p(p)19 );2021parameter CLK_PERIOD = 10;2223initial begin24 rst_n = 0;25 clk = 0;2627 #100;28 rst_n = 1;29end3031always #(CLK_PERIOD/2) clk = ~clk;3233always@(posedge clk)34if(!rst_n)35begin36 a = 8'd0;37 b = 8'd0;38end39else40begin41 a = a + 1;42 b = b - 1;43end4445endmoduleISIM仿真结果:移位相加乘法器树:将assign p_tmp = a_shift0 + a_shift1 + a_shift2 + a_shift3 + a_shift4 + a_shift5 + a_shift6 + a_shift7;换为:assign sum_01 = a_shift0 + a_shift1;assign sum_23 = a_shift2 + a_shift3;assign sum_45 = a_shift4 + a_shift5;assign sum_67 = a_shift6 + a_shift7;assign sum_0123 = sum_01 + sum_23;assign sum_4567 = sum_45 + sum_67;assign p_tmp = sum_0123 + sum_4567;就成为乘法器树。
Verilog实现加减乘除计算器
Verilog实现加减乘除计算器主要内容: 1. 按键按下后,进⾏加减乘除操作 2. Verilog往TXT⽂本⽂件中写⼊数据 3. 完成计算模块 4. 最终实现加减乘除计算器1. 实现按键按下后,选择option,进⾏加减乘除操作,除法计算结果为商&余数module jsq(clk,rst_n,key,option,x,y,result,quotient,remainder);parameter N = 16; // 输⼊数的位数input clk; // 输⼊时钟input rst_n; // 低电平有效的复位(清零)input key;input [1:0]option;input [N-1:0] x;input [N-1:0] y;output [2*N-1:0] result;output [N-1:0] quotient; //输出计算的商output [N-1:0] remainder; //输出计算的余数reg [2*N-1:0] result_r;reg [N-1:0] quotient_r,remainder_r;always @ (posedge clk or negedge rst_n)beginif (!rst_n)beginresult_r <= 1'b0;quotient_r <= 1'b0;remainder_r <= 1'b0;endelsebeginif (key == 1'b0)begin//按键按下case(option)2'b00: result_r = x + y;2'b01: result_r <= x + (~y + 1'b1);2'b10: result_r = x * y;2'b11: //result_r = x / y;beginquotient_r = x / y;remainder_r = x % y;endendcaseendelsebegin// 按键释放result_r <= 1'b0;quotient_r <= 1'b0;remainder_r <= 1'b0;endendendassign result = result_r ;assign quotient= quotient_r;assign remainder = remainder_r;endmoduleView Code`timescale 1ns/1ps`define clock_period 20module jsq_tb;reg clk;reg rst_n;reg key;reg [1:0]option;reg [15:0] x,y;wire [31:0] result;wire [15:0] quotient;wire [15:0] remainder;initial beginclk = 1'b1;rst_n = 1'b0;key = 1'b1; // 复位时,按键释放# 20//复位20nsrst_n = 1'b1;# 20key = 1'b0;option = 2'b10;# 100key = 1'b1;# 20key = 1'b0;option = 2'b11;# 100// key = 1'b1;// # 20$stop;endalways #(`clock_period/2) clk = ~clk; //50Mjsq #(.N(16)) jsq_0(.clk(clk),.rst_n(rst_n),.key(key),.option(option),.x(x),.y(y),.result(result),.quotient(quotient),.remainder(remainder));initial beginx = 0;repeat(20)#(`clock_period) x = {$random}%100; //通过位拼接操作{}产⽣0—59范围的随机数endinitial beginy = 0;repeat(20)#(`clock_period) y = {$random}%50;end/*integer i;initial beginx = 0;y = 0;for(i = 0; i < 20; i = i + 1)begin//利⽤$random系统函数产⽣随机数。
自动售货机fpga与verilog代码
深圳大学课程论文题目设计一个自动售货机成绩专业课程名称、代码年级姓名学号时间年月设计一个自动售货机基本要求:可以对3种不同种类的货物进行自动售货,价格分别为A=1.00, B=1.50, C=1.60。
售货机可以接受1元,5角,1角三种硬币(即有三种输入信号IY,IWJ,IYJ),并且在7段数码管(二位代表元,一位代表角)显示已投入的总钱数,选择货物的输入信号Ia,Ib,Ic,输出指示信号为Sa, Sb ,Sc 分别表示售出相应的货物,同时输出的信号yuan, jiao代表找零,并显示在7段数码管上。
规格说明:1.按一下button1按钮,表示购买货物A,第一个LED灯亮;按两下button1按钮,表示购买货物B,第二个LED灯亮;按三下button1按钮,表示购买货物C,第三个LED灯亮。
2.LED灯亮后,开始输入硬币。
button2按一下,输入1元,按两下,输入两元,以此类推;Button3按一下输入5角,按两下代表1元,以此类推;button4按一下输入1角,按两下输入2角,以此类推。
7段数码管显示已投入的总钱数,再次按下button1键,7段数码管显示找零数目,同时指示货物的LED灯熄灭。
3.本实验使用FPGA板:Sparant6XC6SLX16CSG324C(建project时,需要选择该芯片的型号)。
论文要求:1.论文的格式采用标准的深圳大学以论文、报告等形式考核专用答题纸;2.论文中应完包括ASM图, 以及VerilogHDL代码,并且代码应该与ASM图相一致.3.论文应包括该电路的VerilogHDL仿真.4.论文应该有FPGA开发的布局布线后结果.5.报告应该有实验成功的开发板截图.1.状态图售货机FSM本设计需要2个状态机,一个是售货机工作状态机,一个是按键消抖用的FSM2. Verilog 代码:`timescale 1ns / 1psmodule automat(clk_in,reset,cs,Led,seg,button1_in,button2_in,button3_in,button4_in );input clk_in,reset;input button1_in,button2_in,button3_in,button4_in;output [2:0] Led;output [3:0] cs;output [7:0] seg;reg [7:0] seg;reg [3:0] cs;reg [2:0] Led;reg [6:0] total;reg [4:0] state;reg [2:0] state1,state2,state3,state4;reg [4:0] cnt1,cnt2,cnt3,cnt4;reg button1,button2,button3,button4;reg [6:0] ones,tens;reg clk;reg [23:0] divcnt;parameter wait0 = 3'b001;parameter delay = 3'b010;parameter wait1 = 3'b100;parameter idle = 5'b00001;parameter selA = 5'b00010;parameter selB = 5'b00100;parameter selC = 5'b01000;parameter count = 5'b10000;always @ (posedge clk_in or negedge reset) /// clk_dividerbeginif (!reset)beginclk <= 1'b0;divcnt <= 0;endelse if (divcnt == 99999)beginclk <= 1'b1;divcnt <= 0;endelse if (divcnt == 49999)beginclk <= 1'b0;divcnt <= divcnt + 1;endelsedivcnt <= divcnt + 1;endalways @ (posedge clk or negedge reset) // 7seg scan clk=1Khz beginif (!reset)begincs <= 4'b1101;seg <= 8'b00111000;endelse if (cs == 4'b1101)begincs <= 4'b1110;case(ones)0: seg <= 8'b10000001;1: seg <= 8'b11001111;2: seg <= 8'b10010010;3: seg <= 8'b10000110;4: seg <= 8'b11001100;5: seg <= 8'b10100100;6: seg <= 8'b10100000;7: seg <= 8'b10001111;8: seg <= 8'b10000000;9: seg <= 8'b10000100;default: seg <= 8'b01110000;endcaseendelse if (cs == 4'b1110)begincs <= 4'b1101;case(tens)0: seg <= 8'b00000001;1: seg <= 8'b01001111;2: seg <= 8'b00010010;3: seg <= 8'b00000110;4: seg <= 8'b01001100;5: seg <= 8'b00100100;6: seg <= 8'b00100000;7: seg <= 8'b00001111;8: seg <= 8'b00000000;9: seg <= 8'b00000100;default: seg <= 8'b01110000;endcaseendendalways @ (total) //total decode beginif (total < 10 && total >= 0)begintens = 0;ones = total;endelse if (total < 20 && total >= 10)begintens = 1;ones = total - 10;endelse if (total < 30 && total >= 20) begintens = 2;ones = total - 20;endelse if (total < 40 && total >= 30) begintens = 3;ones = total - 30;endelse if (total < 50 && total >= 40) begintens = 4;ones = total - 40;endelse if (total < 60 && total >= 50) begintens = 5;ones = total - 50;endelse if (total < 70 && total >= 60) begintens = 6;ones = total - 60;endelse if (total < 80 && total >= 70) begintens = 7;ones = total - 70;endelse if (total < 90 && total >= 80) begintens = 8;ones = total - 80;endelse if (total < 100 && total >= 90) begintens = 9;ones = total - 90;endelsebegintens = 9;ones = 9;endendalways @ (posedge clk or negedge reset) // undo key jitter fsm for button1_in beginif (!reset)beginbutton1 <= 1'b0;cnt1 <= 0;state1 <= wait0;endelsebeginbutton1 <= 1'b0;case (state1)wait0: beginif (button1_in)state1 <= delay;elsestate1 <= wait0;enddelay: beginif (cnt1 == 24)begincnt1 <= 0;if (button1_in)beginbutton1 <= 1'b1;state1 <= wait1;endelsestate1 <= wait0;endelsebegincnt1 <= cnt1 + 1;state1 <= delay;endendwait1: beginif (button1_in)state1 <= wait1;elsestate1 <= wait0;enddefault: state1 <= wait0;endcaseendendalways @ (posedge clk or negedge reset) // undo key jitter fsm for button2_in beginif (!reset)beginbutton2 <= 1'b0;cnt2 <= 0;state2 <= wait0;endelsebeginbutton2 <= 1'b0;case (state2)wait0: beginif (button2_in)state2 <= delay;elsestate2 <= wait0;enddelay: beginif (cnt2 == 24)begincnt2 <= 0;if (button2_in)beginbutton2 <= 1'b1;state2 <= wait1;endelsestate2 <= wait0;endelsebegincnt2 <= cnt2 + 1;state2 <= delay;endendwait1: beginif (button2_in)state2 <= wait1;elsestate2 <= wait0;enddefault: state2 <= wait0;endcaseendendalways @ (posedge clk or negedge reset) // undo key jitter fsm for button3_in beginif (!reset)beginbutton3 <= 1'b0;cnt3 <= 0;state3 <= wait0;endelsebeginbutton3 <= 1'b0;case (state3)wait0: beginif (button3_in)state3 <= delay;elsestate3 <= wait0;enddelay: beginif (cnt3 == 24)begincnt3 <= 0;if (button3_in)beginbutton3 <= 1'b1;state3 <= wait1;endelsestate3 <= wait0;endelsebegincnt3 <= cnt3 + 1;state3 <= delay;endendwait1: beginif (button3_in)state3 <= wait1;elsestate3 <= wait0;enddefault: state3 <= wait0;endcaseendendalways @ (posedge clk or negedge reset) // undo key jitter fsm for button3_in beginif (!reset)beginbutton4 <= 1'b0;cnt4 <= 0;state4 <= wait0;endelsebeginbutton4 <= 1'b0;case (state4)wait0: beginif (button4_in)state4 <= delay;elsestate4 <= wait0;enddelay: beginif (cnt4 == 24)begincnt4 <= 0;if (button4_in)beginbutton4 <= 1'b1;state4 <= wait1;endelsestate4 <= wait0;endelsebegincnt4 <= cnt4 + 1;state4 <= delay;endendwait1: beginif (button4_in)state4 <= wait1;elsestate4 <= wait0;enddefault: state4 <= wait0;endcaseendendalways @ (posedge clk or negedge reset) //FSM for automat beginif (!reset)begintotal <= 0;Led <= 3'b000;state <= idle;endelsebegincase (state)idle: beginLed <= 3'b000;if (button1)state <= selA;elsestate <= idle;endselA: begintotal <= 0;Led <= 3'b100;if (button1)state <= selB;else if (button2)beginstate <= count;total <= total + 10;endelse if (button3)beginstate <= count;total <= total + 5;endelse if (button4)beginstate <= count;total <= total + 1;endelsestate <= selA;endselB: beginLed <= 3'b010;if (button1)state <= selC;else if (button2)beginstate <= count;total <= total + 10;endelse if (button3)beginstate <= count;total <= total + 5;endelse if (button4)beginstate <= count;total <= total + 1;endelsestate <= selB;endselC: beginLed <= 3'b001;if (button2)beginstate <= count;total <= total + 10;endelse if (button3)beginstate <= count;total <= total + 5;endelse if (button4)beginstate <= count;total <= total + 1;endelsestate <= selC;endcount: beginif (button2)beginstate <= count;total <= total + 10;endelse if (button3)beginstate <= count;total <= total + 5;endelse if (button4)beginstate <= count;total <= total + 1;endelse if (button1 && (total >= 10) && Led == 3'b100)begintotal <= total - 10;state <= idle;endelse if (button1 && (total >= 15) && Led == 3'b010)begintotal <= total - 15;state <= idle;endelse if (button1 && (total >= 16) && Led == 3'b001)begintotal <= total - 16;state <= idle;endelsestate <= count;enddefault: state <= idle;endcaseendendendmodule3.仿真:Tb代码:`timescale 1ns / 1psmodule tb;reg clk_in;reg reset;reg button1_in;reg button2_in;reg button3_in;reg button4_in;wire [3:0] cs;wire [2:0] Led;wire [7:0] seg;automat uut (.clk_in(clk_in),.reset(reset),.cs(cs),.Led(Led),.seg(seg),.button1_in(button1_in),.button2_in(button2_in),.button3_in(button3_in),.button4_in(button4_in) );initial begin// Initialize Inputsclk_in = 0;reset = 0;button1_in = 0;button2_in = 0;button3_in = 0;button4_in = 0;#1000;reset = 1;#1000;button1_in = 1;#2000000button1_in = 0;#2000000button1_in = 1;#2000000button1_in = 0;#2000000button1_in = 1;#2000000button1_in = 0;#2000000button1_in = 1;#2000000button1_in = 0;#2000000button1_in = 1;#2000000button1_in = 0;#2000000button1_in = 1;#50000000button1_in = 0;//delay 50ms#50000000button2_in = 1;#50000000button2_in = 0;#50000000button3_in = 1;#50000000button3_in = 0;#50000000button4_in = 1;#50000000button4_in = 0;#50000000button1_in = 1;#50000000button1_in = 0;endalways#5 clk_in = ~clk_in;endmodule把button1_in 仿真成与物理电路一样有大约十几秒的抖动Button1 正确的忽略掉抖动产生的影响,产生了一个周期的脉冲买A=1元仿真的过程:button1一来state进入买selA状态button2一来state 进入count状态且total+10 (total=投进钱总数剩10)即表示投进了1元,button3一来total = 15 表示投进了1.5元,button4一来total = 16 表示投了1.6元,最后按button1 出货和找零,total=6表示找零0.6角4.实物展示:本设计下载平台是Nexys3™BoardUcf:#clkNet "clk_in" LOC=V10 | IOSTANDARD=LVCMOS33;Net "clk_in" TNM_NET = sys_clk_pin;TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 100000 kHz;Net "reset" LOC = T10 | IOSTANDARD = LVCMOS33; #Bank = 2, pin name = IO_L29N_GCLK2, Sch name = SW0## LedsNet "Led<0>" LOC = U16 | IOSTANDARD = LVCMOS33; #Bank = 2, pin name = IO_L2P_CMPCLK, Sch name = LD0Net "Led<1>" LOC = V16 | IOSTANDARD = LVCMOS33; #Bank = 2, pin name = IO_L2N_CMPMOSI, Sch name = LD1Net "Led<2>" LOC = U15 | IOSTANDARD = LVCMOS33; #Bank = 2, pin name = IO_L5P, Sch name = LD2#Net "seg<7>" LOC = M13 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L61N, Sch name = DP## 7 segment displayNet "seg<6>" LOC = T17 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L51P_M1DQ12, Sch name = CANet "seg<5>" LOC = T18 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L51N_M1DQ13, Sch name = CBNet "seg<4>" LOC = U17 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L52P_M1DQ14, Sch name = CCNet "seg<3>" LOC = U18 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L52N_M1DQ15, Sch name = CDNet "seg<2>" LOC = M14 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L53P, Sch name = CENet "seg<1>" LOC = N14 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L53N_VREF, Sch name = CFNet "seg<0>" LOC = L14 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L61P, Sch name = CGNet "seg<7>" LOC = M13 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L61N, Sch name = DPNet "cs<0>" LOC = N16 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L50N_M1UDQSN, Sch name = AN0Net "cs<1>" LOC = N15 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L50P_M1UDQS, Sch name = AN1Net "cs<2>" LOC = P18 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name =IO_L49N_M1DQ11, Sch name = AN2Net "cs<3>" LOC = P17 | IOSTANDARD = LVCMOS33; #Bank = 1, pin name = IO_L49P_M1DQ10, Sch name = AN3## ButtonsNet "button1_in" LOC = A8 | IOSTANDARD = LVCMOS33; #Bank = 0, pin name = IO_L33N, Sch name = BTNUNet "button2_in" LOC = C4 | IOSTANDARD = LVCMOS33; #Bank = 0, pin name = IO_L1N_VREF, Sch name = BTNLNet "button3_in" LOC = C9 | IOSTANDARD = LVCMOS33; #Bank = 0, pin name = IO_L34N_GCLK18, Sch name = BTNDNet "button4_in" LOC = D9 | IOSTANDARD = LVCMOS33; # Bank = 0, pin name = IO_L34P_GCLK19, Sch name = BTNR实物图:。
Verilog实现自动售货机
东华理工大学EDA课程设计报告课程设计题目:自动售货控制系统设计学院机械与电子工程学院学生姓名王磊班级080612学号********指导老师黄乡生(教授)2011年6月18日摘要本设计是以现场可编程逻辑器件(FPGA)为核心的自动售货机,利用QuartusII软件编写verilog HDL 硬件描述语言程序以实现自动售货功能。
本程序要求能够完成对货物信息的存取,硬币处理,余额计算,取消购物时退款和显示功能。
关键字:FPGA、Verilog HDL、自动售货机、QuartueIIAbstractThis design is an auto-vendingmachine based on field programmavle logic devices(FPGA).We use QuartusII to write procedure in verilog HDL which is a language to describe hardware.The procedure will realize the function of auto-vending machine.Keywords:FPGA、Verilog HDL、auto-vending machine、QuartueII一、设计要求设计一个自动售货控制系统,它能够完成对货物信息的存取,硬币处理余额计算,取消购物时退款和显示等功能。
(1)假定自动售货机可以出售四种货物,每种商品的数量和单价在初始化时设定,并存储在存储器中。
(2)采用模拟开关信号模拟5角和1元硬币购物,并通过按键选择所需商品。
(3)系统能够根据用户输入的硬币,判断累计货物是否足够,当所投硬币累计达到或者超过购买者所选商品价格时,则根据顾客的要求自动售货,并找回剩余的硬币,然后回到初始状态。
当所投硬币不够时,则给出提示,并通过一个复位键退回所有硬币,然后回到初始状态。
二、设计提示系统框图如下:系统按功能可以分为信号输入、控制器、译码显示等模块。
基于FPGA的16位乘法器的实现
目录引言....................................................................................................................................... - 1 - 摘要....................................................................................................................................... - 2 -一、乘法器概述....................................................................................................................... - 3 -1.1 EDA技术的概念........................................................................................................ - 3 -1.2 EDA技术的特点........................................................................................................ - 3 -1.3 EDA设计流程............................................................................................................ - 5 -1.4硬件描述语言(Verilog HDL)................................................................................ - 5 -二、16位乘法器的设计要求与设计思路.............................................................................. - 6 -2.2 设计要求.................................................................................................................... - 6 -三、16位乘法器的总体框图.................................................................................................. - 6 -四、16位乘法器的综合设计.................................................................................................. - 7 -4.1 16位乘法器功能........................................................................................................ - 7 -4.2 16位乘法器设计思路................................................................................................ - 8 -4.3 基于Verilog HDL 硬件语言的乘法器设计 ............................................................ - 8 -(1)输入模块......................................................................................................... - 8 -(2)乘法模块......................................................................................................... - 9 -五、总体调试与仿真结果..................................................................................................... - 10 -5.1乘法器的RTL Viewer .......................................................................................... - 10 -5.2 16位乘法器的系统程序:....................................................................................... - 11 -5.3计算结果仿真结果................................................................................................... - 12 -5.3.1仿真测试程序(a=6,b=10).............................................................................. - 12 - 总结......................................................................................................................................... - 16 - 参考文献................................................................................................................................. - 16 -引言随着微电子技术的飞速发展,集成电路工艺进入深亚微米阶段,特征尺寸变得越来越小。
Verilog语言的自动售货机
自动售货机完成时间:2010/7/30一、实验目的1)设计一个自动售货机,此机能出售1元、2元、5元、10元的四种商品。
出售哪种商品可有顾客按动相应的一个按键即可,并同时用数码管显示出此商品的价格。
2)顾客投入硬币的钱数也是有1元、2元、5元、10元四种,但每次只能投入其中的一种硬币,此操作通过按动相应的一个按键来模拟,并同时用数码管将投币额显示出来。
3)顾客投币后,按一次确认键,如果投币额不足时则报警,报警时间3秒(可用点阵模拟报警)。
如果投币额足够时自动送出货物(送出的货物用相应不同的指示灯显示来模拟),同时多余的钱应找回,找回的钱数用数码管显示出来。
4)顾客一旦按动确认键3秒后,自动售货机即可自动恢复到初始状态,此时才允许顾客进行下一次购货操作。
5)售货机还应具有供商家使用的累加卖货额的功能,累加的钱数要用数码管显示,显示2位即可。
此累加器只有商家可以控制清零。
6)此售货机要设有一个由商家控制的整体复位控制。
二、实验原理首先应搭建识别模块,将代表每种硬币的拨码开关信号转变为BCD码进行累加。
当累加完成后,将累加结果与代表商品的BCD码相比较。
如果大于售出商品并对两个BCD码求差,求差的结果作为找钱信号;如果等于直接售出商品;小于则报警。
至于统计卖钱额,则是对售出的商品进行累加。
三、分析与设计思路可分为以下模块1)分频模块。
2)计时模块。
用于控制确认键后到恢复初始化的3秒计时。
3)识别模块。
将每种硬币、货品的拨码开关信号转变为编码。
4)清零模块。
用于销售总额的清零。
5)初始化模块6)控制模块。
用于数据读入、投币不足、交易成功状态的控制及转化。
7)显示模块四、程序代码段module autoseller(clk,g,m,yes,read,zero,led_dig,led_seg,led_c,led_r,led); input clk,yes,read,zero;//确定键,商家读取键,清零键input [3:0] g , m; //货品及投币选择键output led_dig,led_seg,led_c,led_r,led;//数码管输出及点阵输出reg f_100;//分频时钟reg f_1;reg [3:0] goods,money,led,change,g_c;integer r,a,b, a_tmp2,a_tmp1;integer ret=0;//用于控制各状态间的转换reg [9:0]count;reg [7:0] led_c,led_r,led_dig,led_seg;reg [1:0]state;integer i;reg x;always @ (posedge clk) //分频模块beginif(a_tmp2==999)beginf_100=~f_100;a_tmp2<=0;endelsea_tmp2<=a_tmp2+1;endalways @ (posedge clk)beginif(a_tmp1==9999999)beginf_1=~f_1;a_tmp1<=0;endelsea_tmp1<=a_tmp1+1;endalways @ (posedge f_1)beginif(ret!=0) //用于按确认键后的计时begina=a+1;endelsebegina=0;endendalways @ (posedge f_100)beginif(zero==0) //清零begincount=0;endif(read!=0) //非商家读取模式(普通读写模式)begin // 识别模块case(g) //表每种货品的拨码开关信号转变为编码4'b0001:begin goods=1;end4'b0010:begin goods=2;end4'b0100:begin goods=5;end4'b1000:begin goods=10;enddefault:begin goods=0;endendcasecase(m) //表每种硬币的拨码开关信号转变为编码4'b0001:begin money=1;end4'b0010:begin money=2;end4'b0100:begin money=5;end4'b1000:begin money=10;enddefault:begin money=0;endendcaseif(a==3) //初始化beginret=0;led=4'b0000;led_c=8'b0000_0000;led_r=8'b1111_1111;x=0;endif(yes==0) //按确定键beginif(money<goods) //金钱不足beginchange=0;ret=1;endelsebegin//金钱足够change=money-goods;ret=2;if(x==0) //交易成功销售总额增加begincount=count+goods;x=1;endendendg_c=goods;//显示模块if(ret==1) //金额不足,数码管报警beginled_c=8'b1111_1111;led_r=8'b0000_0000;endif(ret==2)//交易成功begincase(goods) //LED灯显示货物1:begin led=4'b0001;end2:begin led=4'b0010;end5:begin led=4'b0100;end10:begin led=4'b1000;endendcaseg_c=change;endcase(state)//显示选择的货物0:beginr=g_c % 10;led_dig=8'b1111_1011;case(r)0:begin led_seg=8'b1111_1100;end1:begin led_seg=8'b0110_0000;end2:begin led_seg=8'b1101_1010;end3:begin led_seg=8'b1111_0010;end4:begin led_seg=8'b0110_0110;end5:begin led_seg=8'b1011_0110;end6:begin led_seg=8'b1011_1110;end7:begin led_seg=8'b1110_0000;end8:begin led_seg=8'b1111_1110;end9:begin led_seg=8'b1111_0110;endendcaseend1:beginr=g_c / 10;led_dig=8'b0111_1111;0:begin led_seg=8'b1111_1100;end1:begin led_seg=8'b0110_0000;end2:begin led_seg=8'b1101_1010;end3:begin led_seg=8'b1111_0010;end4:begin led_seg=8'b0110_0110;end5:begin led_seg=8'b1011_0110;end6:begin led_seg=8'b1011_1110;end7:begin led_seg=8'b1110_0000;end8:begin led_seg=8'b1111_1110;end9:begin led_seg=8'b1111_0110;endendcaseend//显示投入的钱数及余额2:beginr=money % 10;led_dig=8'b1110_1111;case(r)0:begin led_seg=8'b1111_1100;end1:begin led_seg=8'b0110_0000;end2:begin led_seg=8'b1101_1010;end3:begin led_seg=8'b1111_0010;end4:begin led_seg=8'b0110_0110;end5:begin led_seg=8'b1011_0110;end6:begin led_seg=8'b1011_1110;end7:begin led_seg=8'b1110_0000;end8:begin led_seg=8'b1111_1110;end9:begin led_seg=8'b1111_0110;endendcaseend3:beginr=money / 10;led_dig=8'b1111_0111;case(r)0:begin led_seg=8'b1111_1100;end1:begin led_seg=8'b0110_0000;end2:begin led_seg=8'b1101_1010;end3:begin led_seg=8'b1111_0010;end4:begin led_seg=8'b0110_0110;end5:begin led_seg=8'b1011_0110;end6:begin led_seg=8'b1011_1110;end7:begin led_seg=8'b1110_0000;end8:begin led_seg=8'b1111_1110;end9:begin led_seg=8'b1111_0110;endendendcasestate=state+1;endif(read==0)//商家读取模式begincase(i) //显示销售总额0:beginb=count/10;led_dig=8'b1111_1110;case(b)0:begin led_seg=8'b1111_1100;end1:begin led_seg=8'b0110_0000;end2:begin led_seg=8'b1101_1010;end3:begin led_seg=8'b1111_0010;end4:begin led_seg=8'b0110_0110;end5:begin led_seg=8'b1011_0110;end6:begin led_seg=8'b1011_1110;end7:begin led_seg=8'b1110_0000;end8:begin led_seg=8'b1111_1110;end9:begin led_seg=8'b1111_0110;endendcaseend1:beginb=count%10;led_dig=8'b1111_1101;case(b)0:begin led_seg=8'b1111_1100;end1:begin led_seg=8'b0110_0000;end2:begin led_seg=8'b1101_1010;end3:begin led_seg=8'b1111_0010;end4:begin led_seg=8'b0110_0110;end5:begin led_seg=8'b1011_0110;end6:begin led_seg=8'b1011_1110;end7:begin led_seg=8'b1110_0000;end8:begin led_seg=8'b1111_1110;end9:begin led_seg=8'b1111_0110;endendcaseendendcasei=i+1;if(i==2)begini=0;endendendendmodule五、对应变量的管脚配置表。
基于Verilog HDL的自动售货机设计与仿真
电子技术Electronic Technology电子技术与软件工程Electronic Technology & Software Engineering 基于Verilog H D L的自动售货机设计与仿真李红科王庆春贾晓菲(安康学院电子与信息工程学院陕西省安康市725000 )摘要:本文应用Verilog H D L语言采用自顶而下的方法设计自动售货机,整个系统包括商品选择、确认、投币、找零和出货等模块。
在Modelsim平台进行功能仿真验证,经过仿真验证设计正确,符合设计要求。
关键词:Verilog H D L;自动售货机;模块设计1引言随着集成电路产业快速发展,电路集成度越来越高,以计算机辅助为基础的电子设计自动化(EDA Electronics Design Automation)技术成为集成电路设计重要工具m,Verilog HDL硬件描述语言是以文字形式描述数字系统硬件电路结构和行为的语言,只需描述电路的功能和电路模块之间的相互关系,设计者更加专注电路设计整体性能,使电路更加优化,提高设计效率|21。
自动售货机是一种常见的智能自动化设备,由于不受人直接参与,所以广泛应用在办公楼、操场、高速服务K等场所,大大降低时间、地点的限制,在节省人力资源方面有着明显优势。
2自动售货机设计思路有限状态机(FSM Finite-state Machine)是•种用来进行对象行为建模的工具,其作用是表示有限个状态以及这些状态之间相互转移和动作等行为的数学模型。
有限状态机广泛应用于建模行为、硬件电路设计、软件工程和网络协议等的设计。
在数字系统设计中,当某一事物发生连续变化时,可以采用有限状态机设计思路提高设计效率,增加程序可读性,降低错误概率,有限状态机设计思路是数字系统中最常用的设计方法之一 [3]。
2.1自动售货机系统总体设计该售货机电路设计要求:(1)每次只能出售一种商品。
(2)所售商品种类:售货机只售4种商品,所售商品编号分 别用四位二进制数从右向左表示为0001、0010、0100、1000,对应价格分别为2元、3元、4元、5元。
verilog编的乘法器
module chengfa(a,b,clk,rst,st,result,done);input[31:0]a,b;//乘数,被乘数input clk,st,rst;//时间信号,运算启动信号,复位信号reg[63:0] p1,p2,p3;output[63:0]result;// 结果输出output done;// 运算结束后的置位信号integer a1,b1;reg[1:0]sign;reg[6:0]i;//i用于控制运算在时序信号下按序进行reg don;assign done=don;assign result=p3;always@(posedge clk or negedge rst)beginif(!rst)i<=7'b0;else if(st&&i<7'd36)i<=i+1'b1;else if(!st)i<=7'b0;endalways@(posedge clk or negedge rst)beginif(!rst) don<=1'b0;else if(i==7'd34) don<=1'd1;//i为34时,运算结束else if(i==7'd36) don<=1'b0;endalways@(posedge clk or negedge rst)beginif(!rst)begina1=32'b0;//复位信号有效时,乘数,被乘数和运算结果全部置零b1=32'b0;p3=64'b0;endelse if(st)beginif(i==7'b0)begina1=a;//所锁存乘数和被乘数b1=b;endelse if(i>7'd0&&i<=7'd1)//利用一个时钟周期的时间来判断符号,将负数的补码表示变为其绝对值的原码。
简单自动售货机VerilogHDL程序
自动售货机VerilogHDL程序一个简单的自动售卖饮料机的程序.该机器具有投币,显示余额,购买六种饮料,退钱等功能,为了更具实用性,增添了饮料选择允许提示和投币允许提示的功能。
具体形容,可投入一元、五元、十元和二十元面值的钱币,显示出当前的余额,并根据当前的余额提示能购买哪些饮料,选择某种饮料,则输出选定的饮料,同时余额减去相应的金钱.若选择退钱,机器就退出所有的钱,余额清零.下图为功能示意图:程序的状态表:程序中包含了一个状态机,定义了一个任务(task)和函数(function),用该任务调用了该函数,使用若干分支语句,详见附后源程序和测试程序。
附上程序编译仿真图:源程序如下:`define one 3'b001`define five 3'b010`define ten 3'b011`define twenty 3’b100module automart(money,state,moneyout,coinable,adrkable,bdrkable,cdrkable,drkout1,drkout2,drkout3,drkout4,drkout5,drkout6,coin,clk,reset,moneyback,choice1,choice2,choice3,choice4,choice5,choice6);input[2:0]coin;//投币输入,分为1、5、10、20元四种输入input clk,reset,moneyback,choice1,choice2,choice3,choice4,choice5,choice6;//moneyback为退钱输入,choice1~6是饮料选择output moneyout,coinable,adrkable,bdrkable,cdrkable,drkout1,drkout2,drkout3,drkout4,drkout5,drkout6;//依次为退钱输出,投币许可提示,饮料选择许可,6种饮料输出output[2:0] state;//状态记录output[7:0] money;//余额显示reg[7:0] money;reg[2:0] state;reg moneyout,coinable,backable,adrkable,bdrkable,cdrkable; parameter A=3'b000,B=3'b001,C=3'b010,D=3'b011,E=4’b100;assign drkout1=choice1&adrkable;assign drkout2=choice2&adrkable;assign drkout3=choice3&bdrkable;assign drkout4=choice4&bdrkable;assign drkout5=choice5&cdrkable;assign drkout6=choice6&cdrkable;always@(posedge clk)repeat(1)@(posedge clk)if (!reset)beginstate<=A;money=0;moneyout=0;endelsebegincase(state)A:begin//初始状态A,可投币进入别的状态coinable=1;backable=0;adrkable=0;bdrkable=0;cdrkable=0;endB: begin//状态B,只能买1元的饮料,可退钱或投币coinable=1;backable=1;adrkable=1;bdrkable=0;cdrkable=0;endC: begin//状态C,可买1或2元的饮料,退钱或投币coinable=1;backable=1;adrkable=1;bdrkable=1;cdrkable=0;endD:begin//状态D,可买三档价格饮料,可退钱或投币coinable=1;backable=1;adrkable=1;bdrkable=1;cdrkable=1;endE:begin//状态E,可买三档价格饮料,可退钱,不可继续投钱coinable=0;backable=1;adrkable=1;bdrkable=1;cdrkable=1;enddefault: state=A;endcasecondition(money,state,coin,coinable);//调用任务endalways@(negedge drkout1 or negedge drkout2)money=money—8’h01;//买1元的饮料,余额减1元always@(negedge drkout3 or negedge drkout4)money=money—8'h02;//买2元的饮料,余额减2元always@(negedge drkout5 or negedge drkout6)money=money—8'h04;//买4元的饮料,余额减4元always@(negedge moneyback)beginif(backable)beginmoneyout=1;money=0;//选择退钱,则推出金钱,余额清零endelsemoney=money+0;endtask condition;//该任务可以判断余额的改变,状态切换inout[7:0] moneycon;inout[2:0] statecon;input[2:0] coincon;input coinablecon;beginif (coinablecon)//允许投币时begincase (coincon)//根据投币面值改变余额,切换状态`one : moneycon=moneycon+8'h01;`five :moneycon=moneycon+8'h05;`ten : moneycon=moneycon+8'h0a;`twenty :moneycon=moneycon+8'h14;default:moneycon=moneycon+0;//无投币则余额不变endcasestatecon=condition_s(moneycon);//调用函数endelse if (moneycon〈8’h14)//不允许投币时,根据余额变化statecon=condition_s(moneycon);//直接切换状态endendtaskfunction [2:0] condition_s;//根据余额的值切换状态的函数input [7:0] money_s;reg [7:0]money_s;beginif (money_s==0)condition_s=A;else if(money_s==8’h01)condition_s=B;else if(money_s==8’h02||money_s==8’h03)condition_s=C;else if(money_s〉=8’h04&&money_s〈8’h14)condition_s=D;else condition_s=E;endendfunctionendmodule测试程序如下:`timescale 100ns/1ns`define clk_cycle 50module test;reg moneyback,choice1,choice2,choice3,choice4,choice5,choice6; reg [2:0] coin;reg clk,reset;wire[7:0] money;wire[2:0]state;wire moneyout,coinable,adrkable,bdrkable,cdrkable,drkout1,drkout2,drkout3,drkout4,drkout5,drkout6;parameter one=3’b001,five=3’b010,ten=3'b011,twenty=3'b100;always #`clk_cycle clk= ~clk;initialbegincoin=0;moneyback=0;clk=0;choice1=0;choice2=0;choice3=0;choice4=0;choice5=0;choice6=0;reset=1;#10 reset=0;#200 reset=1;#400 coin=one;//投币1元,#220 coin=0;#200 coin=one;//投1元,余额2元#220 coin=0;#200 coin=five;//投5元,余额7元#220 coin=0;#200 coin=twenty;//投20元,余27#220 coin=0;#200 choice1=1;//买1元饮料,余26#220 choice1=0;#200 choice3=1;//买2元饮料,余24#220 choice3=0;#200 choice4=1;//买2元饮料,余22#220 choice4=0;#200 choice5=1;//买4元饮料,余18#220 choice5=0;#200 choice6=1;//买4元饮料,余14#220 choice6=0;#200 choice6=1;//买4元饮料,余10#220 choice6=0;#200 choice6=1;//买4元饮料,余6#220 choice6=0;#200 choice6=1;//买4元饮料,余2#220 choice6=0;#200 coin=five;//投5元,余7#220 coin=0;#200 moneyback=1;//退钱#220 moneyback=0;endautomart m(.money(money),。
基于FPGA的16位乘法器例程
摘抄自特权同学的例程2015.9.2316位乘法器的设计`timescale 1ns / 1psmoduletop_module(clk,rst_n,start,ain,bin,yout,done);input clk; //芯片的时钟信号。
input rst_n; //低电平复位、清零信号。
定义为0表示芯片复位;定义为1表示复位信号无效。
input start; //芯片使能信号。
定义为0表示信号无效;定义为1表示芯片读入输入管脚得乘数和被乘数,并将乘积复位清零。
input[15:0] ain; //输入a(被乘数),其数据位宽为16bit.input[15:0] bin; //输入b(乘数),其数据位宽为16bit.output[31:0] yout; //乘积输出,其数据位宽为32bit.output done; //芯片输出标志信号。
定义为1表示乘法运算完成.reg[15:0] areg; //乘数a寄存器reg[15:0] breg; //乘数b寄存器reg[31:0] yout_r; //乘积寄存器regdone_r;reg[4:0] i; //移位次数寄存器//------------------------------------------------//数据位控制always @(posedgeclk or negedgerst_n)if(!rst_n) i <= 5'd0;else if(start && i < 5'd17) i <= i+1'b1;else if(!start) i <= 5'd0;//------------------------------------------------//乘法运算完成标志信号产生always @(posedgeclk or negedgerst_n)if(!rst_n) done_r<= 1'b0;else if(i == 5'd16) done_r<= 1'b1; //乘法运算完成标志else if(i == 5'd17) done_r<= 1'b0; //标志位撤销assign done = done_r;//------------------------------------------------//专用寄存器进行移位累加运算always @(posedgeclk or negedgerst_n) beginif(!rst_n) beginareg<= 16'h0000;breg<= 16'h0000;yout_r<= 32'h00000000;endelse if(start) begin //启动运算if(i == 5'd0) begin //锁存乘数、被乘数areg<= ain;breg<= bin;endelse if(i > 5'd0 && i < 5'd16) beginif(areg[i-1]) yout_r = {1'b0,yout[30:15]+breg,yout_r[14:1]}; //累加并移位else yout_r<= yout_r>>1; //移位不累加endelse if(i == 5'd16 &&areg[15]) yout_r[31:15] <= yout_r[31:15]+breg;endendassignyout =yout_r;endmodule上面代码中最不容易理解的应该就是红色部分。
用verilog编写16位加法器乘法器自动售货机
Verilog课程实验报告实验1十六位超前进位加法器1.1系统设计要求用超前进位加法器实现一个有符号位的16位加法器,并且考虑溢出的情况2.1详细设计根据超前进位加法器的原理Co = G | ( P & Ci ) S = P ^ Ci 设计出4位加法器的子模块,然后通过4个4位加法器的相连来得到十六位的加法器。
原理如下图所示。
溢出用flag=0表示。
3.1程序//-------------16位超前进位加法器-----------------module cla16(a,b,s,flag); //含有a ,b ,输出s ,进位flag 的模块 input [15:0] a,b;//输入a ,b output [16:0] s; //输出 s output reg flag; //进位FA FA FA FAP 0G 1P 0G 1P 2G 2P 3G 3C o,3C o,2C o,1C o,0C i,0FA FA FA FAP 0G 1P 0G 1P 2G 2P 3G 3C o,2C o,1C o,0C i,0C o,3M u l t i p l e x e rBP=P o P 1P 2P 3Idea: If (P0 and P1 and P2 and P3 = 1)then C o3 = C 0, else “kill” or “generate”.wire pp4,pp3,pp2,pp1;wire gg4,gg3,gg2,gg1;wire [15:0] Cp;wire [15:0] p,g;pg i0 (a[15:0],b[15:0],p[15:0],g[15:0]);add i1 (p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],pp1,gg1);add i2 (p[7],p[6],p[5],p[4],g[7],g[6],g[5],g[4],pp2,gg2);add i3 (p[11],p[10],p[9],p[8],g[11],g[10],g[9],g[8],pp3,gg3);add i4 (p[15],p[14],p[13],p[12],g[15],g[14],g[13],g[12],pp4,gg4);add i5 (pp4,pp3,pp2,pp1,gg4,gg3,gg2,gg1,pp5,gg5);//调用四位加法器模块add4 l0 (p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],1'b0,Cp[3],Cp[2],Cp[1],Cp[0]);add4 l1 (p[7],p[6],p[5],p[4],g[7],g[6],g[5],g[4],Cp[3],Cp[7],Cp[6],Cp[5],Cp[4]);add4 l2 (p[11],p[10],p[9],p[8],g[11],g[10],g[9],g[8],Cp[7],Cp[11],Cp[10],Cp[9],Cp[8]);add4 l3 (p[15],p[14],p[13],p[12],g[15],g[14],g[13],g[12],Cp[11],Cp[15],Cp[14],Cp[13],Cp[12]); assign s[0]=p[0]^1'b0; //保留位assign s[1]=p[1]^Cp[0];assign s[2]=p[2]^Cp[1];assign s[3]=p[3]^Cp[2];assign s[4]=p[4]^Cp[3];assign s[5]=p[5]^Cp[4];assign s[6]=p[6]^Cp[5];assign s[7]=p[7]^Cp[6];assign s[8]=p[8]^Cp[7];assign s[9]=p[9]^Cp[8];assign s[10]=p[10]^Cp[9];assign s[11]=p[11]^Cp[10];assign s[12]=p[12]^Cp[11];assign s[13]=p[13]^Cp[12];assign s[14]=p[14]^Cp[13];assign s[15]=p[15]^Cp[14];assign s[16]=pp5|gg5;//溢出判断模块always@(a,b,s)beginif ((a[15]==1&&b[15]==1&&s[15]==0)||(a[15]==0&&b[15]==0&&s[15]==1))flag=1'b1;elseflag=1'b0;endendmodule//4位加法器模块module add4(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],Co,Cp[3],Cp[2],Cp[1],Cp[0]);input [3:0]p,g;output [3:0] Cp;assign Cp[0]=g[0]|p[0]&Co;assign Cp[1]=g[1]|p[1]&Cp[0];assign Cp[2]=g[2]|p[2]&Cp[1];assign Cp[3]=g[3]|p[3]&Cp[2];endmodule//模块间的进位module add(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],pp,gg); input [3:0]p,g;output pp,gg;assign pp=p[3]&p[2]&p[1]&p[0];assign gg=g[3]|(p[3]&(g[2]|p[2]&(g[1]|p[1]&g[0]))); endmodule//进位信号的产生module pg(a,b,p,g);input [15:0] a,b;output [15:0] p,g;assign p=a^b;assign g=a&b;endmodule4.1测试程序通过产生一个随机输入a和b,来验证c=a+b。
基于VerilogHDL的自动售货机设计
基于V e r i l o g H D L的自动售货机设计Pleasure Group Office【T985AB-B866SYT-B182C-BS682T-STT18】密级:NANCHANG UNIVERSITY学士学位论文THESIS OF BACHELOR(2012 —2016年)题目基于Verilog HDL的自动售货机设计学院:信息工程学院系电子信息工程系专业班级:学生姓名:学号:指导教师:职称:教授起讫日期:基于Verilog HDL的自动售货机设计学生姓名:田启泽指导教师:陶凌摘要自动售货机是商业自动化的常用设备,它不受地点和时间的限制,能够支持线上,线下多种支付方式,出货迅速,并且操作简单方便,因此受到了社会各群体的欢迎。
现目前自动售货机多为单片机设计,常出现因功能单一不能满足顾客需求,性能不稳定带来各种售货出错等现象。
本文将论述采用EDA方法,以QuartusⅡ为软件开发平台,使用Verilog HDL 语言设计,经过仿真后,在FPGA器件中实现自动售货机系统的详细流程。
经过仿真验证设计可以实现投币计次,两种售价均为两元的商品选择,购物操作无条件取消,按键消抖,以及投币退币数量显示功能。
硬件电路用一个按键电路实现投币功能,以led的点亮的数量指示投币的数量和商品出货情况,并以七段数码管显示退币的数量。
关键词:自动售货机;Verilog HDL;FPGA;EDA;Quartus ⅡDesign of Vending Machine Based on VHDLAbstractVending machines are commonly used as commercial automated equipment, it is not restricted some trouble aspects,such as place,time and so on. It support online, offline payment methods, fast shipping, and easy operation, therefore has been welcomed by all social groups. Vending machines are currently a mostly single-chip design, often due to a single function can not meet customer needs, bring a variety of sales performance problems due to unstable capability.This article will discusses the selling process of the vending machine by using QuartusⅡas software development platform, with the EDA method and through Verilog HDL language designing, after simulating, complying vending machine system in FPGA devices. After simulation designed it can be achieved coin metering and selection of commodities both are priced at two yuan, unconditionally canceled, key debounce and coin-coin number display. Hardware circuit using a function key circuits replays coin-operated,the number of led lights indicates the number of shipments of goods and coin, and using seven-segment LED to display the number of coin return.Keywords: vending machine;Verilog HDL;FPGA;EDA;Quartus Ⅱ目录14683 4 5 6第一章绪论自动售货机研究背景中国产业调研网发布的2016年版中国自动售货机市场现状调研与发展趋势趋势分析报告认为,居民收入水平显步攀升,自动售货机的迅猛发展得益于消费群体追逐灵活、智能、高效以及自助式服务。
自动售货机 verilog
SOPC及EDA技术课程结业报告题目:基于状态机的自动售货机设计院(系)电气工程及其自动化姓名学号班号基于状态机的自动售货机设计一.实验目的1. 学习FPGA入门知识,了解FPGA的编程形式;2. 掌握Quartus II的使用步骤;3. 掌握基于状态机原理的自动售货机设计过程。
二.实验原理自动售货机是可完成无人自动售货,集光、机、电一体化的商业自动化设备。
自动售货机不受任何场地限制,方便快捷,可以每天24小时售货,因此深受上班族的欢迎,很多城市的公共场所里面都放置有自动售货机,出售的商品五花八门,从饮料、零食、香烟、糖果,到牙刷、方便面、自动照相机。
近年来,我国的自动售货机行业突飞猛进:在汽车总站、商厦、医院、小区、学校等地区纷纷涌现出自动售货机的踪迹。
这种方便快捷的购物方式越来越受到人们的青睐,同时也是现代化城市配套设施的需求。
因为自动售货机作为社会上完成商品零售和综合服务的独立设施,所以必须要求它的结构可靠、稳定而且执行效率高。
传统的自动售货机控制系统采用单片机作为控制核心,这样不仅会在输入输出接口上做大量的工作,而且系统的抗干扰性也比较差。
可编程控制器(Programmable Logical Controller,简称PLC)是综合了计算机技术、自动控制技术和通讯技术而发展起来的一种新型的工业控制装置,它具有可靠性高、编程简单、维护方便等优点,已在工业控制领域得到广泛地应用。
PLC是以CPU为核心, 综合了计算机技术和通信技术发展起来的一种通用的工业自动控制装置, 是现代工业控制的三大支柱(PLC、机器人和CAD/CAM) 之一。
PLC的工作原理与计算机的工作原理基本是一致的, 可以简单地表述为在系统程序的管理下, 通过运行应用程序完成用户任务。
但是PLC也有它自己的特点, PLC在确定了工作任务, 装入了专用程序后成为一种专用机, 它采用循环扫描工作方式, 系统工作任务管理及应用程序执行都是用循环扫描方式完成的。
verilog乘法运算和加法运算
verilog乘法运算和加法运算【原创实用版】目录1.Verilog 简介2.乘法运算的实现2.1 4 位乘 2 位2.2 扩展到任意位数3.加法运算的实现3.1 4 位加 4 位3.2 扩展到任意位数4.总结正文一、Verilog 简介Verilog 是一种硬件描述语言,主要用于数字系统的设计和验证。
它的语法简单易学,可以描述各种数字电路,包括组合逻辑、时序逻辑和混合信号电路。
Verilog 中包含各种基本的逻辑门、寄存器、计数器等组件,用户可以根据需要进行组合和连接。
二、乘法运算的实现1.4 位乘 2 位的乘法运算在 Verilog 中,我们可以使用循环来实现乘法运算。
例如,实现 4 位乘 2 位的乘法运算,可以使用以下代码:```verilogmodule multiplier_4bit_2bit (input [3:0] a,input [1:0] b,output [7:0] result);reg [7:0] temp;integer i;always @(*) beginfor (i = 0; i < 4; i = i + 1) begintemp[i] = a[i] * b;endresult = temp;endendmodule```2.扩展到任意位数如果要实现任意位数的乘法运算,可以采用类似的方法,只需要将循环次数和寄存器位数相应地调整即可。
例如,实现 16 位乘 16 位的乘法运算,可以使用以下代码:```verilogmodule multiplier_16bit_16bit (input [15:0] a,input [15:0] b,output [31:0] result);reg [31:0] temp;integer i;always @(*) beginfor (i = 0; i < 16; i = i + 1) begintemp[i] = a[i] * b[i];endresult = temp;endendmodule```三、加法运算的实现1.4 位加 4 位的加法运算在 Verilog 中,实现加法运算同样可以使用循环。
16位乘法器学习笔记(Verilog语言源程序+仿真程序)
LCD1602显示源程序如下:module lcd1602(input clk, //60Minput rst_n,output lcd_p, //Backlight Source + lcd屏幕背光output lcd_n, //Backlight Source -output reg lcd_rs, //0:write order; 1:write dataoutput lcd_rw, //0:write data; 1:read dataoutput reg lcd_en, //negedge 在lcd_en下降沿需保证数据有效output reg [7:0] lcd_data);mux16mul(.rst_n(rst_n),.clk(clk),.start(start),.ain(data0),.bin(data1),.yout(data2),.done(done));//端口名称关联//--------------------lcd1602 order----------------------------parameter Mode_Set = 8'h31, //功能设置,Cursor_Set = 8'h0c, //光标设置Address_Set = 8'h06, //输入模式设置Clear_Set = 8'h01; //清屏设置/****************************LCD1602 Display Data****************************/ wire [7:0] data_r0,data_r1,data_r2; //乘数、被乘数wire [15:0]data0,data1; //结果显示wire [31:0]data2;wire [7:0] addr; //write addresswire start,done;assign data_r0 = 8'h30 + data0[7:0] ; // 8'h30在LCD1602上显示值为0。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Verilog课程实验报告实验1十六位超前进位加法器1.1系统设计要求用超前进位加法器实现一个有符号位的16位加法器,并且考虑溢出的情况2.1详细设计根据超前进位加法器的原理Co = G | ( P & Ci ) S = P ^ Ci 设计出4位加法器的子模块,然后通过4个4位加法器的相连来得到十六位的加法器。
原理如下图所示。
溢出用flag=0表示。
3.1程序//-------------16位超前进位加法器-----------------module cla16(a,b,s,flag); //含有a ,b ,输出s ,进位flag 的模块 input [15:0] a,b;//输入a ,b output [16:0] s; //输出 s output reg flag; //进位FA FA FA FAP 0G 1P 0G 1P 2G 2P 3G 3C o,3C o,2C o,1C o,0C i,0FA FA FA FAP 0G 1P 0G 1P 2G 2P 3G 3C o,2C o,1C o,0C i,0C o,3M u l t i p l e x e rBP=P o P 1P 2P 3Idea: If (P0 and P1 and P2 and P3 = 1)then C o3 = C 0, else “kill” or “generate”.wire pp4,pp3,pp2,pp1;wire gg4,gg3,gg2,gg1;wire [15:0] Cp;wire [15:0] p,g;pg i0 (a[15:0],b[15:0],p[15:0],g[15:0]);add i1 (p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],pp1,gg1);add i2 (p[7],p[6],p[5],p[4],g[7],g[6],g[5],g[4],pp2,gg2);add i3 (p[11],p[10],p[9],p[8],g[11],g[10],g[9],g[8],pp3,gg3);add i4 (p[15],p[14],p[13],p[12],g[15],g[14],g[13],g[12],pp4,gg4);add i5 (pp4,pp3,pp2,pp1,gg4,gg3,gg2,gg1,pp5,gg5);//调用四位加法器模块add4 l0 (p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],1'b0,Cp[3],Cp[2],Cp[1],Cp[0]);add4 l1 (p[7],p[6],p[5],p[4],g[7],g[6],g[5],g[4],Cp[3],Cp[7],Cp[6],Cp[5],Cp[4]);add4 l2 (p[11],p[10],p[9],p[8],g[11],g[10],g[9],g[8],Cp[7],Cp[11],Cp[10],Cp[9],Cp[8]);add4 l3 (p[15],p[14],p[13],p[12],g[15],g[14],g[13],g[12],Cp[11],Cp[15],Cp[14],Cp[13],Cp[12]); assign s[0]=p[0]^1'b0; //保留位assign s[1]=p[1]^Cp[0];assign s[2]=p[2]^Cp[1];assign s[3]=p[3]^Cp[2];assign s[4]=p[4]^Cp[3];assign s[5]=p[5]^Cp[4];assign s[6]=p[6]^Cp[5];assign s[7]=p[7]^Cp[6];assign s[8]=p[8]^Cp[7];assign s[9]=p[9]^Cp[8];assign s[10]=p[10]^Cp[9];assign s[11]=p[11]^Cp[10];assign s[12]=p[12]^Cp[11];assign s[13]=p[13]^Cp[12];assign s[14]=p[14]^Cp[13];assign s[15]=p[15]^Cp[14];assign s[16]=pp5|gg5;//溢出判断模块always@(a,b,s)beginif ((a[15]==1&&b[15]==1&&s[15]==0)||(a[15]==0&&b[15]==0&&s[15]==1))flag=1'b1;elseflag=1'b0;endendmodule//4位加法器模块module add4(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],Co,Cp[3],Cp[2],Cp[1],Cp[0]);input [3:0]p,g;output [3:0] Cp;assign Cp[0]=g[0]|p[0]&Co;assign Cp[1]=g[1]|p[1]&Cp[0];assign Cp[2]=g[2]|p[2]&Cp[1];assign Cp[3]=g[3]|p[3]&Cp[2];endmodule//模块间的进位module add(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],pp,gg); input [3:0]p,g;output pp,gg;assign pp=p[3]&p[2]&p[1]&p[0];assign gg=g[3]|(p[3]&(g[2]|p[2]&(g[1]|p[1]&g[0]))); endmodule//进位信号的产生module pg(a,b,p,g);input [15:0] a,b;output [15:0] p,g;assign p=a^b;assign g=a&b;endmodule4.1测试程序通过产生一个随机输入a和b,来验证c=a+b。
//16位加法器的测试文件`timescale 1ns/1ns`include"./sixteenadder.v"module sixteenaddertest;wire [15:0] s;reg [15:0]a,b;wire flag;parameter times=5;//随机产生一个数,总共产生6次initialbegina={$random}%65536;b={$random}%65536;repeat(times)begin#100a={$random}%65536;b={$random}%65536;#100 $stop;endcla16 cal161(a,b,s,flag);endmodule5.1仿真波形用mudelsim10.0仿真得到的波形如下所示:如图a=13604,b=24193 s=-27739.s为负数,产生溢出,溢出标位sto=1.当a=-10743,,b=22115.s=11372没有溢出,sto=0.通过这个实验验证了s=a+b,实现了带符号位的加法器。
实验二十六位加减法器1.1系统设计要求将加法器和减法器结合到一起,实现带符号位的16位加减法运算,并考虑溢出。
2.1详细设计在16位加法器的基础上,加上一条判断语句,如果出现减的操作,被减数取反加一,这样就实现了减的运算,用add_sub来表示加减运算符,当add_sub=0时候实现的是减运算,add_sub=1的时候实现的是加运算。
3.1程序//--------------------16位加减法器------------------------module cla16(a,b,s); //定义模块包括a,b,sinput [15:0] a,b;//输入a,boutput [16:0] s; //输出swire pp4,pp3,pp2,pp1;wire gg4,gg3,gg2,gg1;wire [15:0] Cp;wire [15:0] p,g;pg i0 (a[15:0],b[15:0],p[15:0],g[15:0]);add i1 (p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],pp1,gg1);add i2 (p[7],p[6],p[5],p[4],g[7],g[6],g[5],g[4],pp2,gg2);add i3 (p[11],p[10],p[9],p[8],g[11],g[10],g[9],g[8],pp3,gg3);add i4 (p[15],p[14],p[13],p[12],g[15],g[14],g[13],g[12],pp4,gg4);add i5 (pp4,pp3,pp2,pp1,gg4,gg3,gg2,gg1,pp5,gg5);add4 l0 (p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],1'b0,Cp[3],Cp[2],Cp[1],Cp[0]);add4 l1 (p[7],p[6],p[5],p[4],g[7],g[6],g[5],g[4],Cp[3],Cp[7],Cp[6],Cp[5],Cp[4]);add4 l2 (p[11],p[10],p[9],p[8],g[11],g[10],g[9],g[8],Cp[7],Cp[11],Cp[10],Cp[9],Cp[8]);add4 l3 (p[15],p[14],p[13],p[12],g[15],g[14],g[13],g[12],Cp[11],Cp[15],Cp[14],Cp[13],Cp[12]); assign s[0]=p[0]^1'b0;assign s[1]=p[1]^Cp[0];assign s[2]=p[2]^Cp[1];assign s[3]=p[3]^Cp[2];assign s[4]=p[4]^Cp[3];assign s[5]=p[5]^Cp[4];assign s[6]=p[6]^Cp[5];assign s[7]=p[7]^Cp[6];assign s[8]=p[8]^Cp[7];assign s[9]=p[9]^Cp[8];assign s[10]=p[10]^Cp[9];assign s[11]=p[11]^Cp[10];assign s[12]=p[12]^Cp[11];assign s[13]=p[13]^Cp[12];assign s[14]=p[14]^Cp[13];assign s[15]=p[15]^Cp[14];assign s[16]=pp5|gg5;endmodulemodule add4(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],Co,Cp[3],Cp[2],Cp[1],Cp[0]); input [3:0]p,g;input Co;output [3:0] Cp;assign Cp[0]=g[0]|p[0]&Co;assign Cp[1]=g[1]|p[1]&Cp[0];assign Cp[2]=g[2]|p[2]&Cp[1];assign Cp[3]=g[3]|p[3]&Cp[2];endmodulemodule add(p[3],p[2],p[1],p[0],g[3],g[2],g[1],g[0],pp,gg);input [3:0]p,g;output pp,gg;assign pp=p[3]&p[2]&p[1]&p[0];assign gg=g[3]|(p[3]&(g[2]|p[2]&(g[1]|p[1]&g[0])));endmodulemodule pg(a,b,p,g);input [15:0] a,b;output [15:0] p,g;assign p=a^b;assign g=a&b;endmodule//定义加减法器的模块module addsub(a,b,s,flag,add_sub);input[15:0]a,b;input add_sub;output [15:0] s;output reg flag;wire [15:0]b1;cla16 cla1(a,b1,s);/* always@(posedge clk)beginif(~add_sub)beginb1=~b;b1=b1+1;else b1=b;end*/assign b1= (add_sub)? b:(~b+1'b1);//判断是否为减操作,为减操作的话是取反加一的运算always@(a,b,s) //判断是否溢出beginif((a[15]==1&&b[15]==1&&add_sub==1&&s[15]==0)||(a[15]==0&&b[15]==0&&add_sub==1&&s[1 5]==1))flag=1'b1;elseflag=1'b0;endendmodule4.1测试程序`timescale 1ns/1ns`include"./adder_sub.v"module adder_sub_test;wire [15:0] s;reg [15:0]a,b;reg add_sub;wire flag;initial //初始化,输入测试的数据begina=-16'h7851;b=16'ha432;add_sub=1;#100begina=-16'h1233;b=16'h3211;add_sub=0;end#100begina=16'h0232;b=16'ha161;add_sub=1;#100begina=16'h5632;b=16'h04a1;add_sub=0;end#100begina=-16'h1234;b=16'h4525;add_sub=0;end#1000 $stop;endaddsub addsub1(a,b,s,flag,add_sub);endmodule5.1仿真结果用modelsim10.0仿真,得到的结果如下所示:当a=-30801 b=-23502,add-sub=1,加操作,s溢出,产生溢出信号flag=1.当a=-4659 b=12817 add_sub=0,减操作,输出s=-17476,无溢出,flag=0.当a=562 b=-24223 add_sub=1,加操作,输出s=-23661,无溢出,flag=0.通过以上的结果分析,此程序实现了带符号位的加减法的功能。