用verilog语言设计四位简单计算器
verilog之四位计数器(编译仿真查看波形)
verilog之四位计数器(编译仿真查看波形)先上⼀段计数器的verilog代码:/*4位计数器这例⼦⾮常好的表达了⼀个概念就是同步复位的概念。
这个概念⾮常重要,在XILINX的器件所有硬核都使⽤同步复位。
如果使⽤异步复位需要多耗费资源。
接着说计数器,计数器必须有时钟,如果要能进⼊到初始值,必须有复位输⼊。
和⼀个计数器的输出。
该4位计数器,三个选项全部具备。
在时钟上升沿,如果复位信号有效,则复位为0,如果复位信号⽆效,则计数器需要加⼀。
另外让⼤家思考下,如果是计数器的最⼤值是 13怎么办?低电平复位时钟上升沿计数*/module count4(out,reset,clk);output[3:0] out;input reset,clk;reg[3:0] out;always @(posedge clk)beginif (reset)out<=0; //同步复位elseout<=out+1'b1; //计数endendmodule再附⼀⾸testbeach:/*File Name : ctr_tb.vDescription : The testbench of the ctr_4.vWritten By : LiMingData : 2011/04/19 16:13modefied : Period = 4ns*/`timescale 1ns/1nsmodule test;/*Make a reset that pulses once.*/reg reset = 0;initialbegin#2 reset = 1; //reset#3 reset = 0; //start count#24 reset = 1; //reset#2 reset = 0; //start count#48 reset = 1; //reset#1 reset = 0; //start count#60 reset = 1; //reset#3 reset = 0; //start count#100 $stop;end/*Make a regular pulsing closk*/parameter clk_period = 4;reg clk;initialclk = 0;always #(clk_period/2)clk = ~clk;wire[3:0] out;count4 ctr(out,reset,clk);initial$monitor("At time %t, value = %h (%0d)",$time, out, out);initialbegin$dumpfile("test.lxt");$dumpvars(0,test);endendmodule再再附批处理⽂件:ECHO OFFECHO *********************************ECHO * Batch fileECHO *********************************ECHO *ECHO ONiverilog -o test ctr_4.v ctr_tb.vvvp -n test -lxt2gtkwave test.lxt运⾏结果:G:\Verilog HDL\examples\Verilog135\02_4bitctr>go.batG:\Verilog HDL\examples\Verilog135\02_4bitctr>ECHO OFF********************************** Batch file**********************************G:\Verilog HDL\examples\Verilog135\02_4bitctr>iverilog -o test ctr_4.v ctr_tb.v G:\Verilog HDL\examples\Verilog135\02_4bitctr>vvp -n test -lxt2LXT2 info: dumpfile test.lxt opened for output.At time 0, value = x (x)At time 2, value = 0 (0)At time 6, value = 1 (1)At time 10, value = 2 (2)At time 14, value = 3 (3)At time 18, value = 4 (4)At time 22, value = 5 (5)At time 26, value = 6 (6)At time 30, value = 0 (0)At time 34, value = 1 (1)At time 38, value = 2 (2)At time 42, value = 3 (3)At time 46, value = 4 (4)At time 50, value = 5 (5)At time 54, value = 6 (6)At time 58, value = 7 (7)At time 62, value = 8 (8)At time 66, value = 9 (9)At time 70, value = a (10)At time 74, value = b (11)At time 78, value = c (12)At time 82, value = d (13)At time 86, value = e (14)At time 90, value = f (15)At time 94, value = 0 (0)At time 98, value = 1 (1)At time 102, value = 2 (2)At time 106, value = 3 (3)At time 110, value = 4 (4)At time 114, value = 5 (5)At time 118, value = 6 (6)At time 122, value = 7 (7)At time 126, value = 8 (8)At time 130, value = 9 (9)At time 134, value = a (10)At time 138, value = b (11)At time 142, value = 0 (0)At time 146, value = 1 (1)At time 150, value = 2 (2)At time 154, value = 3 (3)At time 158, value = 4 (4)At time 162, value = 5 (5)At time 166, value = 6 (6)At time 170, value = 7 (7)At time 174, value = 8 (8)At time 178, value = 9 (9)At time 182, value = a (10)At time 186, value = b (11)At time 190, value = c (12)At time 194, value = d (13)At time 198, value = e (14)At time 202, value = f (15)At time 206, value = 0 (0)At time 210, value = 1 (1)At time 214, value = 2 (2)At time 218, value = 3 (3)At time 222, value = 4 (4)At time 226, value = 5 (5)At time 230, value = 6 (6)At time 234, value = 7 (7)At time 238, value = 8 (8)At time 242, value = 9 (9)G:\Verilog HDL\examples\Verilog135\02_4bitctr>gtkwave test.lxt GTKWave的波形图:全局复位0处的波形:复位1处的波形:复位2处的波形:复位3处的波形:。
课程设计--四位二进制加减法器
组合逻辑电路课程设计之四位二进制加减法器摘要:加法器即是产生数的和的装置。
加数和被加数为输入,和数与进位为输出的装置为半加器。
若加数、被加数与低位的进位数为输入,而和数与进位为输出则为全加器。
对于4位的二进制加法,相关的有五个的量:1,被加数A ,2,被加数B ,3,前一位的进位CIN ,4,此位二数相加的和S ,5,此位二数相加产生的进位COUT 。
前三个量为输入量,后两个量为输出量,五个量均为4位.本文采用4位二进制并行加法器原理,选择74LS283,74LS283是4位二进制先行进位加法器,它只用了几级逻辑来形成,并连接几个异或门,由其构成4位二进制加法器/减法器,并用Verilog HDL 进行仿真。
关键字:全加器,异或门,74LS283, verilog,加法/减法功能.总的电路设计 一.硬件电路的设计本电路74LS283为核心元件,其逻辑符号为U174LS283DSUM_410SUM_313SUM_14SUM_21C49B411A412B315A314B22A23B16A15C07全加器由加位输入X 和Y ,还有进位输入CIN,3个输入的范围是0~3,可以用两个输出位表示.S(全加和)和COUT(送给高位的进位).满足下面等式.CINY CIN X Y X COUT CINY X CIN Y X N CI Y X N CI Y X CIN Y X S ⋅+⋅+⋅=⋅⋅+⋅'⋅'+'⋅⋅'+'⋅'⋅=⊕⊕=实现全加器的电路图如下74LS08D本电路还需要4个异或门,要实现加法器和减法器的双重功能,需要有选择功能端,设A为四位二进制被加数,B为二进制被减数.当使能端为0时,电路实现加法运算,当使能端为1时电路实现减法运算.电路原理图如下1.Multisim原理图2.MAX plus2原理图当A口输入为0011,B口输入为0001,使能端为0时.输出为0100.电路图如下当A口输入为0011,B口输入为0001,使能端输入为1时.输出为0010.电路图如下二.软件程序设计Verilog HDL语言程序module b(A,B,C,D,E);input[3:0] A,B;input C;output[3:0] D;output E;assign {E,D}=C?(A+B):(A-B);endmodule当A口输入为0011,B口输入为0001,使能端输入为0,输出为0010,仿真图如下.当A口输入为0011,B口输入为0001,使能端输入为1时.输出为0010.仿真图如下三.总结及心得体会1.通过本次课题设计,自学了一些相关的Verilog语言和MAX+plusII,Multisim 软件的使用方法.2.基本掌握了74LS283的基本原理及使用方法.。
硬件工程师笔试题
硬件工程师笔试题1. VHDL编程题请使用VHDL语言设计一个具有以下功能的4位加法器,并画出其逻辑电路:- 输入:A(4位二进制数),B(4位二进制数)- 输出:Sum(4位二进制数),Carry(进位信号)2. CPU设计题设计一个简易的4位CPU,要求实现以下功能:- 支持4位整数的加法和减法运算- 可以进行数值的存储和加载- 支持条件跳转指令(例如:大于、小于、等于)请用文字描述和图示展示你的设计思路和具体实现。
3. PCB设计题请设计一个2层PCB板,具体要求如下:- 板子尺寸为10cm x 10cm- 内层信号层(Signal Layer)和地层(Ground Layer)- 使用SMT(表面贴装技术)元件布局方式- 配置足够的电源管理和滤波电路- PCB布线要考虑信号完整性和阻抗匹配请使用PCB设计工具完成设计,并输出Gerber文件和BOM表。
4. 信号完整性分析题假设你的电路板上有一个高速时钟信号(频率为100MHz),请回答以下问题:- 如何使用示波器进行时域分析和频谱分析?- 信号传输线上会出现哪些问题?如何优化信号完整性?- 介绍一个常用的信号完整性仿真工具,并简述其原理与使用方法。
5. FPGA设计题请使用Verilog HDL设计一个简单的数字频率计算器,要求实现以下功能:- 输入:时钟信号(50MHz)- 输出:输入时钟信号的频率(以Hz为单位)请描述你的设计思路和具体实现,并给出Verilog代码和仿真波形截图。
总结:本文涵盖了硬件工程师笔试题的各个方面,包括VHDL编程、CPU设计、PCB设计、信号完整性分析以及FPGA设计。
通过回答这些问题,读者可以对硬件工程师的技术能力和综合素质有更全面的了解。
希望本文对读者在硬件工程师领域的学习和职业发展有所帮助。
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系统函数产⽣随机数。
Verilog实现的4位串行进位加法器精编版
Verilog实现的4位串行进位加法器精编版在数字电路中,加法器是最基本的电路之一、串行进位加法器是一种将两个二进制数相加的电路,通过逐位相加的方式实现。
本文将介绍如何使用Verilog语言实现一个4位串行进位加法器的精编版。
首先,我们需要定义输入和输出端口。
对于一个4位的串行进位加法器,我们需要4个输入端口A[3:0]和B[3:0],以及一个输出端口Sum[3:0]。
另外,还需要一个输入端口CarryIn和一个输出端口CarryOut,用于传递进位信号。
```module SerialCarryAdderinput [3:0] A,input [3:0] B,input CarryIn,output [3:0] Sum,output CarryOut```接下来,我们可以定义内部信号。
对于一个4位的串行进位加法器,我们需要4个内部信号,分别代表每一位的进位信号。
```wire C0, C1, C2, C3;```然后,我们可以开始实现每一位的加法逻辑。
首先,我们定义一个内部信号XOROut,用于存储每一位的异或结果。
然后,我们使用XOR门实现异或逻辑。
```wire XOROut;assign XOROut = A[0] ^ B[0];```接下来,我们定义一个内部信号ANDOut,用于存储每一位的与结果。
然后,我们使用AND门实现与逻辑。
```wire ANDOut;assign ANDOut = A[0] & B[0];```然后,我们定义一个内部信号Sum0,用于存储第一位的和结果。
然后,我们使用XOR门实现异或逻辑。
```wire Sum0;assign Sum0 = XOROut ^ CarryIn;```然后,我们定义一个内部信号Carry0,用于存储第一位的进位结果。
然后,我们使用OR门实现或逻辑。
```wire Carry0;assign Carry0 = ANDOut , (XOROut & CarryIn);```接下来,我们可以依次实现剩余3位的加法逻辑。
4位全加器verilog课程设计
4位全加器verilog课程设计一、课程目标知识目标:1. 理解4位全加器的原理和功能,掌握其Verilog硬件描述语言实现方法。
2. 学习并掌握数字电路中加法器的基本结构和工作原理。
3. 掌握Verilog模块化编程,能够实现并测试4位全加器的基本功能。
技能目标:1. 能够运用Verilog语言编写4位全加器的代码,并进行功能仿真。
2. 学会使用硬件描述语言进行数字电路的设计,提高实际问题解决能力。
3. 能够对4位全加器进行调试和优化,提升编程实践技能。
情感态度价值观目标:1. 培养学生的团队合作意识,提高学生在项目实践中的沟通与协作能力。
2. 增强学生对数字电路设计领域的兴趣,激发学生的创新精神。
3. 引导学生树立正确的价值观,认识到科技发展对社会进步的重要性。
课程性质:本课程为电子信息工程及相关专业高年级的数字电路设计课程,旨在通过4位全加器的Verilog实现,让学生掌握数字电路设计的基本方法和实践技能。
学生特点:学生已具备一定的数字电路基础和Verilog编程知识,具备分析问题和解决问题的能力。
教学要求:注重理论与实践相结合,鼓励学生积极参与课堂讨论,培养学生的动手能力和实际操作技能。
通过课程学习,使学生在知识、技能和情感态度价值观方面均取得明显进步。
二、教学内容本课程教学内容主要包括以下几部分:1. 数字加法器原理回顾:介绍加法器的基本原理,重点讲解4位全加器的工作流程和关键特性。
- 教材章节:数字电路基础,第3章第2节。
2. Verilog硬件描述语言基础:复习Verilog的基本语法,强调模块化编程方法。
- 教材章节:硬件描述语言Verilog,第4章。
3. 4位全加器的Verilog设计:- 设计原理:讲解4位全加器的设计思路和实现方法。
- 代码编写:引导学生编写4位全加器的Verilog代码,并进行模块化设计。
- 教材章节:数字电路设计,第5章第3节。
4. 功能仿真与调试:- 介绍仿真工具和仿真方法,指导学生进行4位全加器的功能仿真。
Verilog实现的4位串行进位加法器
Verilog实现的4位串行进位加法器以下是一个使用Verilog语言实现的4位串行进位加法器的示例代码:```verilogmodule serial_carry_adder(input wire clk, reset, input wirea0, b0, a1, b1, a2, b2, a3, b3, input wire cin, output wire cout, output wire [3:0] sum);reg [3:0] s;reg c;if (reset)s<=4'b0;else begins<={s[2:0],a0^b0^c};c<=(a0&b0),(a0&c),(b0&c);endendassign sum = s;assign cout = c;endmodule```这个示例代码中,定义了一个名为`serial_carry_adder`的模块,包含了输入端口`clk`(时钟信号)、`reset`(复位信号)、`a0`、`b0`、`a1`、`b1`、`a2`、`b2`、`a3`、`b3`(4位加数和被加数的各位)、`cin`(进位输入)、以及输出端口`cout`(进位输出)和`sum`(和)。
在`always`块中,根据时钟信号和复位信号的边沿变化来更新和`s`和进位输出`c`的值。
当复位信号为高电平时,和`s`被清零;否则,和`s`的值是上一次和的低3位与当前的加法和(即`a0`、`b0`和进位`c`的异或结果)拼接而成,进位输出`c`的值则根据加法和的三个输入的与运算和或运算结果来决定。
最后,使用`assign`语句将和`s`和进位输出`c`分别赋值给输出端口`sum`和`cout`。
这个模块可以通过在顶层模块中实例化并连接适当的时钟、复位、输入和输出信号来使用。
verilog计数器代码
verilog计数器代码
Verilog语言可以用于编写数字逻辑电路的描述,包括计数器。
下面是一个简单的4位同步计数器的Verilog代码示例:
verilog.
module counter(。
input wire clk, // 时钟输入。
input wire rst, // 复位输入。
output reg [3:0] count // 4位计数器输出。
);
always @(posedge clk or posedge rst) begin.
if (rst) begin.
count <= 4'b0000; // 复位时计数器清零。
end else begin.
count <= count + 1; // 每个时钟周期计数器加1。
end.
end.
endmodule.
在这个例子中,我们定义了一个名为`counter`的模块,它有一
个时钟输入`clk`和一个复位输入`rst`,以及一个4位的计数器输
出`count`。
在`always`块中,我们使用了时钟的上升沿来触发计数
器的增加操作,并且在复位信号为高电平时将计数器清零。
这只是一个简单的示例,实际的计数器可能会更复杂,具体取
决于所需的功能和性能要求。
希望这个示例能够帮助你开始编写Verilog计数器的代码。
触发器设计4位异步计数器原理
触发器设计4位异步计数器原理一个4位异步计数器通常是指一个能够计数到16(2的4次方)的计数器。
异步计数器中,每个触发器的时钟信号是独立的,不依赖于其他触发器的状态。
以下是一个简单的4位异步计数器的原理:1. 设计:-使用4个触发器(比如D 触发器)来实现4位计数器。
每个触发器对应一个二进制位。
-连接触发器的时钟信号独立,使得它们可以独立工作。
-每个触发器的输出作为下一个触发器的时钟输入。
2. 电路图示例:-假设使用D 触发器,每个触发器有两个输入:D(数据输入)和CLK(时钟输入)以及一个输出Q。
-假设Q0 是最低位,Q3 是最高位。
-连接D 触发器的时钟输入:CLK0 -> CLK1 -> CLK2 -> CLK3。
-连接D 触发器的数据输入:D0 -> Q0,D1 -> Q1,D2 -> Q2,D3 -> Q3。
3. 计数逻辑:-当一个触发器的时钟信号上升沿到来时,它会将其数据输入传递到输出。
-计数器的逻辑是通过触发器之间的连接实现的。
例如,每次触发器Q0 到达1(从0到1的过渡),都会触发Q1 从0到1,以此类推。
-当Q3 达到1 时,整个计数器将复位,重新从0开始。
4. 异步复位(可选):-为了使计数器可以复位,可以添加一个异步复位输入。
当异步复位输入为1时,计数器被复位为0。
5. 示例代码(VHDL):```vhdllibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity FourBitAsyncCounter isPort ( CLK : in STD_LOGIC;RST : in STD_LOGIC;Q : out STD_LOGIC_VECTOR(3 downto 0));end FourBitAsyncCounter;architecture Behavioral of FourBitAsyncCounter issignal count_reg : STD_LOGIC_VECTOR(3 downto 0) := "0000";beginprocess (CLK, RST)beginif RST = '1' thencount_reg <= "0000";elsif rising_edge(CLK) thencount_reg <= count_reg + 1;end if;end process;Q <= count_reg;end Behavioral;```这是一个简单的VHDL 代码示例,实现了一个4位异步计数器。
4位并行加法器代码
4位并行加法器代码(原创版)目录1.4 位并行加法器的概念和原理2.4 位并行加法器的实现代码3.4 位并行加法器的应用场景正文一、4 位并行加法器的概念和原理4 位并行加法器是一种能够同时对四个二进制数进行加法运算的电路。
在计算机中,数据都是以二进制的形式存储和运算的。
并行加法器可以在一个时钟周期内完成四个二进制数的加法运算,相较于传统的串行加法器,其运算速度得到了显著提升。
二、4 位并行加法器的实现代码以下是一个简单的 4 位并行加法器的 Verilog 代码实现:```verilogmodule parallel_adder_4bit(input [3:0] A, input [3:0] B, output [3:0] SUM, output CARRY);wire [3:0] carry;assign carry[0] = 1"b0;genvar i;generatefor (i = 0; i < 4; i = i + 1) beginfull_adder FA(A[i], B[i], carry[i], SUM[i],CARRY);endendgenerateassign CARRY = carry[4];endmodulemodule full_adder(input A, input B, input C_in, output SUM, output C_out);assign SUM = A ^ B ^ C_in;assign C_out = (A & B) | (A & C_in) | (B & C_in);endmodule```三、4 位并行加法器的应用场景4 位并行加法器广泛应用于计算机系统、通信系统、数字信号处理等领域。
在计算机中,它可以提高数据处理的速度,使得运算结果更快地被输出。
在通信系统中,它可以对接收到的信号进行快速加法运算,从而实现信号的解调。
verilog简单乘法器
verilog简单乘法器Verilog简单乘法器Verilog是一种硬件描述语言,用于描述数字系统的行为。
在数字电路设计中,乘法器是一个常见的电路组件,它用于执行乘法运算。
本文将介绍一个简单的Verilog乘法器的设计与实现。
乘法器是一种数字电路,用于计算两个数的乘积。
它接收两个输入数,将它们相乘得到一个输出。
在本文中,我们将实现一个4位乘法器,即输入和输出都是4位的二进制数。
我们需要定义输入和输出端口。
在Verilog中,我们可以使用“input”和“output”关键字来声明端口。
对于4位乘法器,我们可以声明两个4位的输入端口A和B,以及一个8位的输出端口P。
module simple_multiplier(input [3:0] A,input [3:0] B,output [7:0] P);接下来,我们需要实现乘法器的功能。
乘法器的实现可以通过多次执行加法运算来实现。
具体地,我们可以将输入的两个4位数逐位相乘,然后将得到的部分乘积相加得到最终的乘积。
在Verilog中,我们可以使用“assign”关键字来执行赋值操作。
我们可以定义一些临时变量,用于存储部分乘积和最终乘积的结果。
然后,通过多次执行加法运算,将部分乘积相加得到最终乘积。
下面是一个实现4位乘法器的简单示例代码:reg [7:0] temp;reg [7:0] result;always @(*) begintemp = A[0] * B;result = temp;temp = A[1] * B;result = result + (temp << 1);temp = A[2] * B;result = result + (temp << 2);temp = A[3] * B;result = result + (temp << 3);endassign P = result;在上述代码中,我们使用了一个“always”块来执行乘法器的功能。
实验一4位运算器设计
实验⼀4位运算器设计实验⼆ 4 位运算器设计⼀、实验名称:4 位运算器设计⼆、实验学时:5 学时三、实验⽬的:1. 利⽤Verilog建⽴4位运算器模型2. 对所设计的运算器进⾏功能验证四、实验内容:设计⼀个四位算术逻辑运算器电路,并测试其功能。
具体要求如下:1. 设计运算器,实验加减乘、逻辑与、或等功能和⾃⾏设计记录表格2. 输⼊端的0,1 可由拨码开关模拟3. 输出端接Led 灯显⽰输出数据4. 观察输出结果,记录输⼊、输出数据。
五、实验原理:1. ALU原理算术逻辑单元 (Arithmetic-Logic Unit, ALU)是中央处理器的执⾏单元,是所有中央处理器的核⼼组成部分,由"And Gate" 和"Or Gate"构成的算术逻辑单元,主要功能是进⾏⼆位元的算术运算,如加减乘(不包括整数除法)。
2. ⽤拨码开关来模拟 0、1 输⼊3. led指⽰灯显⽰输出4. ⽤按钮来模拟 0、1的低位进位输⼊六、实验步骤:1.根据实验要求作预习报告。
2.建⽴⼯程,设计程序:1)新建⼯程;2)新建verilog HDL⽂件(注:⽂件名和模块名称要和⼯程名保持⼀致)。
3)调试程序:3. 配置管脚:参照实验指导中的管脚图,配置管脚。
4.下载到开发板,观察实验结果,尝试创造⾃⼰的实验⽅案:七、实验报告要求:1. 说明实验⽬的、原理、步骤2. 实验程序及程序分析3. 给出试验结果(显⽰的结果,如照⽚或计算机绘制图⽚)4. 给出实验记录,并对记录进⾏分析。
5. 总结分析实验中所出现的问题,有何收获和体会。
【连载】FPGAVerilogHDL系列实例--------4位二进制加减法计数器
【连载】FPGAVerilogHDL系列实例--------4位⼆进制加减法计数器Verilog HDL 之 4位⼆进制加减法计数器⼀、原理 计数器是数字系统中⽤的较多的基本逻辑器件。
它不仅能记录输⼊时钟脉冲的个数,还可以实现分频、定时等功能。
计数器的种类很多。
按脉冲⽅式可以分为同步计数器和异步计数器;按进制可以分为⼆进制计数器和⾮⼆进制计数器;按计数过程数字的增减,可分为加计数器、减计数器和可逆计数器。
本实验就是设计⼀个4位⼆进制加减法计数器,该计数器可以通过⼀个控制信号决定计数器时加计数还是减计数,另外,该寄存器还有⼀个清零输⼊,低电平有效。
还有⼀个load装载数据的信号输⼊,⽤于预置数据;还有⼀个C的输出,⽤于计数器的级联。
其功能表如表1.1所⽰; 表1.1 4位⼆进制加减法计数器功能表⼆、实现在设计⽂件中输⼊Verilog代码1/****************************** 分频模块 *************************************/23 `timescale 1 ns / 1 ps4 module qu_dou ( clk ,rst , a ,b );56 input clk ;7 wire clk ;8 input rst ;9 input a ;10 wire a ;1112 output b ;13 reg b ;1415 reg [31:0] cnt ;16 reg clkout ;17 always @ ( posedge clk or negedge rst )18 begin19if ( rst == 1'b0 )20 cnt <= 0 ;21else begin if ( a==1'b1 ) begin22if ( cnt >= 32'd3000000 )23 b <= 1 ;24else25 cnt <= cnt + 1'b1 ;2627 end28else begin b <= 1'b0 ;29 cnt <= 0 ;30 end31 end32 end333435 endmodule功能实现1 `timescale 1 ns / 1 ps23 module counter4 ( load ,clr ,c ,DOUT ,clk, up_down ,DIN ,sysclk , rst );45 input load ;6 input clk;7 wire load ;8 input clr ;9 wire clr ;10 input up_down ;11 wire up_down ;12 input [3:0] DIN ;13 wire [3:0] DIN ;14 input sysclk ;15 input rst ;1617 output c ;18 reg c ;19 output [3:0] DOUT ;20 wire [3:0] DOUT ;21 reg [3:0] data_r;2223/***************** 例化去抖模块 *************************************/24 wire clk_r ;25 qu_dou qu_dou (26 .clk (sysclk) ,27 .rst (rst) ,28 .a (clk),29 .b (clk_r));3031//********************************************************************* 323334 assign DOUT = data_r;35 always @ ( posedge clk_r or posedge clr or posedge load)36 begin37if ( clr == 1) //同步清零38 data_r <= 0;39else if ( load == 1) //同步预置40 data_r <= DIN;41else begin if ( up_down ==1)42 begin43if ( data_r == 4'b1111) begin //加计数44 data_r <= 4'b0000;45 c = 1;46 end47else begin //减计数48 data_r <= data_r +1;49 c = 0 ;50 end51 end52else53 begin54if ( data_r == 4'b0000) begin //加计数55 data_r <= 4'b1111;56 c = 1;57 end58else begin //减计数59 data_r <= data_r -1;60 c = 0 ;61 end62 end63 end64 end65 endmodule。
verilog之四位全加器的编译及仿真(用开源免费的软件——iverilog+GTKWave)
verilog之四位全加器的编译及仿真(⽤开源免费的软件——iverilog+GTKWave)四位全加器的verilog的代码⽐⽐皆是,这⾥上⼀个⽐较简单的:/*4位全加器全加器需要有输⼊输出,需要有下级向上进位的输⼊,需要有向上⼀位进位的输出。
⼤家看⼀下,这个模块已经包含全部的输⼊输出信息。
⼤家都知道,N位加法器得出来的出来的和最多是N+1位因此可以清晰从下⾯代码中看到相关信息。
然后assign⽤的是阻塞赋值。
相加即满⾜相关的需求。
*/module adder4(cout,sum,ina,inb,cin);output[3:0] sum;output cout;input[3:0] ina,inb;input cin;assign {cout,sum}=ina+inb+cin;endmodule在写testbeach⽂件之前,先普及⼀点testbeach的知识:⼀般来讲,在数据类型声明时,和被测模块的输⼊端⼝相连的信号定义为reg类型,这样便于在initial语句和always语句块中对其进⾏赋值;和被测模块输出端⼝相连的信号定义为wire类型,便于进⾏检测。
Testbench模块最重要的的任务就是利⽤各种合法的语句,产⽣适当的时序和数据,以完成测试,并达到覆盖率要求。
那么testbeach⽂件如下:/*File Name : test_adder4.vDescription : The testbench of the adder_4.vWritten By : LiMingData : 2011/04/18 20:13modefied : 在仿真的时候,把延时从10ns改为5ns: cout显⽰为2位*///test_adder4 (top-level module)`timescale 1ns/1nsmodule test_adder4;//Declare variableswire[3:0] sum;wire cout;reg[3:0] ina,inb;reg cin;//Instantiate the module adder4adder4 adder4_1(cout,sum,ina,inb,cin);//Stimulate the inputs, Finish the stimulation at 90 time unitsinitialbegin#0 ina = 4'b0001; inb = 4'b1010; cin = 1'b0;#5 ina = 4'b0010; inb = 4'b1010; cin = 1'b1;#5 ina = 4'b0010; inb = 4'b1110; cin = 1'b0;#5 ina = 4'b0011; inb = 4'b1100; cin = 1'b1;#5 ina = 4'b0111; inb = 4'b1001; cin = 1'b0;#5 ina = 4'b0001; inb = 4'b1100; cin = 1'b1;#5 ina = 4'b0011; inb = 4'b1100; cin = 1'b0;#5 ina = 4'b0111; inb = 4'b1111; cin = 1'b1;#5 $finish;endinitial$monitor("At time %t, ina(%b) + inb(%b) + cin(%b) = sum(%b)(%2d),cout(%b)",$time, ina, inb, cin, sum, sum, cout);initialbegin$dumpfile("test.vcd");$dumpvars(0,test_adder4);endendmodule由于是在windows的cmd下进⾏命令⾏的运⾏,所以有时候每次输⼊⼀个命令显得很费时间,所以我这⾥⼜写了⼀个(批处理⽂件)bat⽂件:go.batECHO OFFECHO *********************************ECHO * Batch fileECHO *********************************ECHO *ECHO ONiverilog -o test adder4.v test_adder4.vvvp -n test -lxt2cp test.vcd test.lxtgtkwave test.lxt(说明⼀下,我在windows下安装了gnuwin的软件,即能在windows下⽤gnu的⼀些⼩的实⽤的⼯具!)哈哈,这⾥就可以⼀键运⾏了,上⾯的⼀些命令的解释可以到我的“wndows下如何⽤Iverilog+GTKWave进⾏verilog的编译和查看仿真波形”的博⽂⾥去看看吧。
用Verilog HDL语言编写的四位超前进位加法器
——Verilog HDL语言
四位超前进位加法器的进位是并 行同时产生的,能够极大的减 少加法器由进位引起的延时。 增加了逻辑器件,但有效的减 少的延迟。进位是由ALU部件超 前算出,本位是由四个不含进 位的加法器算出。
Verilog HDL代码如下: module jiafaqi_4(x,y,c0,c4,f); //四位超前进位加法器 input [4:1]x; //四位x值 input [4:1]y; //四位y值 output [4:1]f; //四位加和f input c0; //上一的级进位 output c4; //向下一级的进位 wire [3:1]c; //超前进位 wire [4:1]p; wire [4:1]g; wire [4:1]cd; assign p=x|y; assign g=x&y;
module jiafaqi_1(x,y,c0,f); //一位加法器模块 input x; input y; input c0; output f; assign f=(x^y)^c0; endmodule //该一位加法器只有本位输出,不含向下一级 的进位输出,进位输出是由顶层模块的并 行超前进位提供
// 在BASYS2开发板上的管脚配置 NET "c4" LOC = N5; NET "c0" LOC = A7; NET "x[1]" LOC = P11; NET "x[2]" LOC = L3; NET "x[3]" LOC = K3; NET "x[4]" LOC = B4; NET "y[1]" LOC = G3; NET "y[2]" LOC = F3; NET "y[3]" LOC = E2; NET "y[4]" LOC = N3; NET "f[1]" LOC = M5; NET "f[2]" LOC = M11; NET "f[3]" LOC = P7; NET "f[4]" LOC = P6;
4位二进制并行加法器的设计
实验一4位二进制并行加法器的设计1.实验目的:(1)学习使用Quartus II软件的基本用法(2)了解和掌握VHDL语言的语法规则和编程方法及基本流程(3)了解VHDL语言的基本结构2.实验内容用VHDL语言设计一4位二进制并行加法器。
参考设计思路:加法器是数字系统中的基本逻辑器件,减法器和硬件乘法器都可由加法器来构成。
多位加法器的构成有两种方式:并行进位和串行进位方式。
并行进位加法器设有进位产生逻辑,运算速度较快;串行进位方式是将全加器级联构成多位加法器。
并行进位加法器通常比串行级联加法器占用更多的资源。
随着位数的增加,相同位数的并行加法器与串行加法器的资源占用差距也越来越大。
因此,在工程中使用加法器时,要在速度和容量之间寻找平衡点。
实践证明,4位二进制并行加法器和串行级联加法器占用几乎相同的资源。
这样,多位加法器由4位二进制并行加法器级联构成是较好的折中选择。
3.实验要求(1)编写VHDL程序(2)记录系统仿真,画出时序图(3)记录实验过程中遇到的问题及解决办法4.程序设计5.生成RTL电路图6.仿真波形7.实验心得本周的实验是我学习该门课程进行的第一次实验,在实验过程中遇到了很多问题,比如:对Quartus II软件不熟悉,而且全是英文状态,不会使用软件的功能;编写程序时,多次报错,各种各样报错;编写程序完成后,成功编译了,但不会对仿真赋值等。
最后,我通过反复观看老师发的实验操作案例,并通过百度搜索相关的操作流程,翻阅教科书查找相关的解决方案。
第一次实验难免会遇到困难,最后经过我的不懈努力,终于把问题解决了,实验也很成功。
VHDL语言4位十进制计数器、4位锁存器、测频控制器的设计
电子设计自动化实验实验名称综合性实验二、硬件描述语言的层次化设计实验设备〔1〕EDA实验箱(型号 ),〔2〕计算机,〔3〕EDA软件〔QuartusII〕实验目的1、熟悉EDA软件〔QuartusII〕的硬件描述语言输入设计方法;2、掌握VHDL语言的层次化设计方法和仿真分析方法;3、了解功能仿真、时序仿真和时序参数分析的意义。
实验内容1、用VHDL语言完成4位十进制计数器、4位锁存器、测频控制器的设计,包括编译、综合、仿真;**2、采用层次化设计的方法,用VHDL语言的元件例化语句写出4位十进制频率计的顶层文件,并分别给出其测频功能和时序仿真分析波形图,并加以分析;**3、用EDA实验箱进展硬件验证,并分析测量结果;建议硬件测试实验电路采用NO.0电路构造,待测信号F_IN接clock0;测频控制时钟CLK接clock2;**4、在2根底上将其扩展为8位十进制频率计,或带译码输出的4位十进制频率计。
实验报告要求根据以上实验内容写出实验报告:1、简述4位频率计模块的工作原理及其设计、编译、仿真分析过程;2、给出模块设计文件、仿真测试文件、仿真结果波形图及其分析报告;3、简述硬件验证过程和验证结果。
1、简述4位频率计模块的工作原理根据频率的定义和频率测量的根本原理,测定信号的频率必须有一个脉宽为1秒的对输入信号脉冲计数允许的信号;1秒计数完毕后,计数值锁入锁存器的锁存信号和为下一测频计数周期作准备的计数器清0信号。
这3个信号可以由一个测频控制信号发生器产生,即TESTCTL,它的设计要求是,TESTCTL的计数使能信号T_EN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器T10的ENA使能端进展同步控制。
当T_EN高电平时,允许计数;低电平时停顿计数,并保持其所计的脉冲数。
在停顿计数期间,首先需要产生一个锁存信号LOAD,在该信号上升沿时,将计数器在前1秒钟的计数值锁存进各锁存器REG4B中,并由外部的7段译码器译出,显示计数值。
vhdl 四位流水线乘法器
实验二四位流水线乘法器一、实验目的1.了解四位并行乘法器的原理。
2.了解四位并行乘法器的设计思想和流水线的实现方法。
3.掌握用VHDL 语言实现基本二进制运算的方法。
二、实验内容与要求通过开关和键盘输入两组4BIT的二进制数据,按照二进制加法器原理进行加和,求出和及进位,并通过LED显示灯输出显示,完成编译、综合、适配、仿真、实验箱上的硬件测试。
三、实验原理流水线结构的并行乘法器的最大有点就是速度快,尤其实在连续输入的乘法器中,可以达到近乎单周期的运算速度。
流水线乘法器是组合逻辑电路实现无符号数乘法的方法上发展而来的。
其关键是在组合逻辑电路的基础上插入寄存器。
假如有被乘数A 和乘数B,首先用A 与B 的最低位相乘得到S1,然后再把A 左移1 位与B 的第2 位相乘得到S2,再将A 左移3 位与B 的第三位相乘得到S3,依此类推,直到把B 的所有位都乘完为止,然后再把乘得的结果S1、S2、S3……相加即得到相乘的结果。
需要注意的是,具体实现乘法器是,并不是真正的去乘,而是利用简单的判断去实现,举个简单的例子。
假如A 左移n 位后与B 的第n 位相乘,如果B 的这位为‘1’,那么相乘的中间结果就是A 左移n 位后的结果,否则如果B 的这位为‘0’,那么就直接让相乘的中间结果为0 即可。
带B 的所有位相乘结束后,把所有的中间结果相加即得到A 与B 相乘的结果。
在此基础上插入寄存器即可实现流水线乘法器。
四、实验平台(1)硬件:计算机、GX-SOC/SOPC-DEV-LABCycloneII EP2C35F672C8核心板(2)软件:Quartus II软件PIN_AF8 DATAOUT[4] LED4PIN_AE7 DATAOUT[5] LED5PIN_AF7 DATAOUT[6] LED6PIN_AA11 DATAOUT[7] LED7PIN_AE21 BCD[0] 数码管DP4BPIN_AB20 BCD[1]PIN_AC20 BCD[2]PIN_AF20 BCD[3]PIN_AE20 BCD[4] 数码管DP5BPIN_AD19 BCD[5]PIN_AC19 BCD[6]PIN_AA17 BCD[7]PIN_AA18 BCD[8] 数码管DP6BPIN_W17 BCD[9]PIN_V17 BCD[10]PIN_AB18 BCD[11]六、仿真截图七、硬件实现八、程序代码1---clkgen.vhdlibrary IEEE;-- 1HZuse IEEE.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity clkgen isport (CLK : in std_logic;CLK1HZ: out std_logic);end entity;architecture clk_arch of clkgen issignal COUNT : integer range 0 to 50000000; --50MHZ -->1hz begin -- 50M/1=50000000 PROCESS(CLK)BEGINif clk'event and clk='1' thenIF COUNT= 50000000 thenCOUNT<=0;ELSE COUNT<=COUNT+1;END IF;END IF;END PROCESS;PROCESS(COUNT)BEGINIF COUNT= 5000000 THEN -- 1HZCLK1HZ<='1';ELSE CLK1HZ<='0';END IF;END PROCESS;end architecture;2—BCD-- 输出控制模块,把乘法器的输出转换成BCD码在数码管上显示、-- SCKZ.VHDlibrary IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity BIN2BCD isport ( DIN: in std_logic_vector(7 downto 0); ---The input 8bit binaryBCDOUT: out std_logic_vector(11 downto 0)--输出显示, 已转换成BCD码);end entity;architecture arch of BIN2BCD issignal data2,data3,data4 :std_logic_vector(9 downto 0);-- 输出数据缓存signal hundred,ten,unit:std_logic_vector(3 downto 0);--signal bcdbuffer:std_logic_vector(11 downto 0);---2'1111_1001_11=999beginBCDOUT<= bcdbuffer;bcdbuffer(11 downto 8)<=hundred;bcdbuffer(7 downto 4)<=ten;bcdbuffer(3 downto 0)<=unit;get_hundred_value:process(data2)beginDA TA2<="00"&DIN;---get hundred valueif data2>=900 thenhundred<="1001";--9data3<=data2-900;elsif data2>=800 thenhundred<="1000";--8data3<=data2-500;elsif data2>=700 thenhundred<="0111";--7data3<=data2-700;elsif data2>=600 thenhundred<="0110";--6data3<=data2-600;elsif data2>=500 thenhundred<="0101";--5data3<=data2-500;elsif data2>=400 thenhundred<="0100";--4data3<=data2-400;elsif data2>=300 thenhundred<="0011";--3data3<=data2-300;elsif data2>=200 thenhundred<="0010";--2data3<=data2-200;elsif data2>=100 thenhundred<="0001";--1data3<=data2-100;else data3<=data2;hundred<="0000";end if;end process; ---get_thousand_valueget_tens_value:process(data3) begin---get tens placeif data3>=90 thenten<="1001";--9data4<=data3-90;elsif data3>=80 thenten<="1000";--8data4<=data3-50;elsif data3>=70 thenten<="0111";--7data4<=data3-70;elsif data3>=60 thenten<="0110";--6data4<=data3-60;elsif data3>=50 thenten<="0101";--5data4<=data3-50;elsif data3>=40 thenten<="0100";--4data4<=data3-40;elsif data3>=30 thenten<="0011";--3data4<=data3-30;elsif data3>=20 thenten<="0010";--2data4<=data3-20;elsif data3>=10 thenten<="0001";--1data4<=data3-10;else data4<=data3;ten<="0000";end if;end process; ---get_ten_valueget_unit_value:process(data4)begin--unit's orderif (data4>0) thenunit<=data4(3 downto 0);else unit<="0000";end if;end process;end arch;3 multi4b --------------------------------------------------------------------------------/ -- DESCRIPTION : Signed mulitplier:-- AIN (A) input width : 4-- BIN (B) input width : 4-- Q (data_out) output width : 8-- 并行流水乘法器--------------------------------------------------------------------------------/--10 × 9 = 90-- 1 0 1 0-- 1 0 0 1 =-- --------------- 1 0 1 0-- 0 0 0 0 --partial products-- 0 0 0 0-- 1 0 1 0-- -------------------- 1 0 1 1 0 1 0--parallel : process all the inputs at the same time--pipeline : use several stages with registers to implement it----关键思想,插入寄存器library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity multi4b isport ( CLK: in STD_LOGIC; ---system clockAIN: in STD_LOGIC_VECTOR (3 downto 0); ---one inputBIN: in STD_LOGIC_VECTOR (3 downto 0);-- the other inputdata_out: out STD_LOGIC_VECTOR (7 downto 0)---the result ---make sure the biggest value ,i,e. 1111x1111=1110_0001 can be held in the register );end multi4b;architecture multi_arch of multi4b issignal A,B :std_logic_vector(3 downto 0); --input register---registers to hold the result of the first processing---registers added to make use of pipeline, the 1st stagesignal A_MULT_B0: STD_LOGIC_VECTOR (3 downto 0);signal A_MULT_B1: STD_LOGIC_VECTOR (3 downto 0);signal A_MULT_B2: STD_LOGIC_VECTOR (3 downto 0);signal A_MULT_B3: STD_LOGIC_VECTOR (3 downto 0);---register to hold the result of the multipliersignal C_TEMP : STD_LOGIC_VECTOR (7 downto 0);beginPROCESS(CLK,AIN,BIN)beginif CLK'EVENT AND CLK='1' THEN-- multiplier operand inputs are registeredA<= AIN;B<= BIN;-----------------Fist stage of the multiplier------------------here we get the axb(0),axb(1),axb(2),axb(3),i.e.partial products---put them into the responding registersA_MULT_B0(0) <= A (0) and B (0);----- multi 1 , get the a(0) and b(0), & put it into the register A_MULT_B0(0)A_MULT_B0(1) <= A (1) and B (0);A_MULT_B0(2) <= A (2) and B (0);A_MULT_B0(3) <= A (3) and B (0);--10 × 9 = 90-- 1 0 1 0-- 1 0 0 1 =-- --------------- 0 0 0 0 1 0 1 0-- 0 0 0 0 0 0 0 0 --partial products-- 0 0 0 0-- 1 0 1 0-- -------------------- 1 0 1 1 0 1 0A_MULT_B1(0) <= A (0) and B (1);A_MULT_B1(1) <= A (1) and B (1);A_MULT_B1(2) <= A (2) and B (1);A_MULT_B1(3) <= A (3) and B (1);A_MULT_B2(0) <= A (0) and B (2);A_MULT_B2(1) <= A (1) and B (2);A_MULT_B2(2) <= A (2) and B (2);A_MULT_B2(3) <= A (3) and B (2);A_MULT_B3(0) <= A (0) and B (3);A_MULT_B3(1) <= A (1) and B (3);A_MULT_B3(2) <= A (2) and B (3);A_MULT_B3(3) <= A (3) and B (3);end if;end process;--------------------Second stage of the multiplier---------------add the all the partial products ,then get the result of the multiplier C_TEMP<=( "0000" & A_MULT_B0 )+( "000"& A_MULT_B1 &'0' )+( "00" & A_MULT_B2 & "00" )+( '0'&A_MULT_B3 & "000" );--build a signal register output---输出寄存,利于实现流水data_out <= C_TEMP; --output registerend multi_arch;九、实验总结。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
module jsq(clk,keyin,keyout,leda,ledb,num3);
input clk;
input [3:0]keyin;
output [3:0]keyout;
reg [3:0]keyout;
output [3:0]leda;
reg [3:0]leda;
output [3:0]ledb;
reg [3:0]ledb;
integer clk_klv;
output [31:0]num3;
always @(posedge clk) //分频
clk_klv=clk_klv+1;
reg [1:0]keyhang=0; //按键扫描
reg [3:0]keynum=0; //最近按键的值
reg keyen=0; //按键锁定作用,每次都必须重新按下才有效
reg keysign=0; //当前按键的属性,0代表数字,1代表 +-*/=复位reg [7:0]delay=0; //按键消抖
reg order2=0; //作用:延迟一个时钟,keyen跳变输出,确保keynum 被赋值
always @(posedge clk_klv[10])
begin
if(order2==0)
begin
case({keyhang,keyin})
6'b00_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h0;
order2=1;end end
6'b00_1101: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h1;
order2=1;end end
6'b00_1011: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h2;
order2=1;end end
6'b00_0111: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h3;
order2=1;end end
6'b01_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h4;
order2=1;end end
6'b01_1101: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h5;
order2=1;end end
6'b01_1011: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h6;
order2=1;end end
6'b01_0111: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h7;
order2=1;end end
6'b10_1110: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h8;
order2=1;end end
6'b10_1101: begin delay=0;if(keyen==0)begin keysign=0;keynum=4'h9;
order2=1;end end
6'b10_1011: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'ha;
order2=1;end end
6'b10_0111: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hb;
order2=1;end end
6'b11_1110: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hc;
order2=1;end end
6'b11_1101: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hd;
order2=1;end end
6'b11_1011: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'he;
order2=1;end end
6'b11_0111: begin delay=0;if(keyen==0)begin keysign=1;keynum=4'hf;
order2=1;end end
default: begin
keyhang=keyhang+1;delay=delay+1;if(delay>=100)keyen=0;end
endcase
case(keyhang)
0:keyout=4'b1110;
1:keyout=4'b1101;
2:keyout=4'b1011;
3:keyout=4'b0111;
endcase
end
else
begin keyen=1;order2=0;end
end
reg [2:0]order=0; //当前状态
integer num1=0,num2=0,num3=0; //第一个,第二个,结果
reg [3:0]sign; //+-*/
reg [7:0]lednum=100; //显示的数字
reg [3:0]in_num=0; //限制显示的数字位,限制在2为:0~99
always @(posedge keyen)
begin
case(order)
0: if(keysign) begin sign[3:0]=keynum[3:0];order=order+1; in_num=0;end //在没有按下+-*/之前会存储数字
else
if(num1<10000)begin num1=num1*10+keynum;
lednum=num1;
in_num=in_num+1; end
1: if(keysign) begin
case(sign)
//在没有按下=号之前会存储数字
4'ha:num3=num1+num2;
4'hb:num3=num1-num2;
4'hc:num3=num1*num2;
4'hd:num3=num1/num2;
endcase
lednum=num3+0;
order=order+1;
end
else if(num2<10000)begin num2=num2*10;num2=num2+keynum;
lednum=num2;
in_num=in_num+1; end
endcase
if(keynum==4'hf)begin order=0;num1=0;num2=0;num3=0;lednum=100;end //复位
end
always @(*) //显示函数
if(lednum<=99)
begin
leda=lednum/10;
ledb=lednum%10;
end
else
begin
leda=15;
ledb=15;
end
endmodule。