数电课程设计--简易两位数计数器

更新时间:2024-07-09 06:54:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

西北工业大学

课 程 设 计 报 告

学 班 学生(学号)学生(姓名)学生(学号)学生(姓名)

目: 简易两位数计算器

院: 电子信息学院 级: 0802 : : : : 日期: 2014 年 1 月 13 - 1 -

西北工业大学 电子信息学院 08021103班

摘 要

FPGA是可编程逻辑器件,在早期可编程逻辑器件PAL和GAL的基础上发展而来,但电路规模更大。同时FPGA具有许多优点,在数字电路设计中得到广泛的应用。本次设计过程中,我们使用了Altera公司开发的CycloneIII芯片,使用DE0开发板,完成我们的设计。在设计过程中,主要使用Verilog编程语言进行编程,由于它和C语言有一定的相似之处,使用起来较为方便。本次课程设计,我们通过编程实现键盘PS2输入和利用数码管显示数据,并且完成VGA显示结果,根据DE0 使用说明,合理安排引脚和时序,顺利完成预定的功能,同时也了解了FPGA和其编程控制过程,为以后的设计奠定了基础。

关键词:FPGA Verilog编程语言 PS2 VGA

- 2 -

西北工业大学 电子信息学院 08021103班

目 录

i. 课程设计目的 ????????????????????????? 4 ii. 设计任务与要求???????????????????????? 4 iii. 方案设计与论证 ????????????????????????5 iv. 单元电路设计与参数计算 ????????????????9 v. 遇到问题的解决方法???????????????????? 17 vi. 结论与心得 ??????????????????????????? 18 vii. 参考文献????????????????????????????? 18

- 3 -

西北工业大学 电子信息学院 08021103班

题目:简易两位数计算器

一、 课程设计目的

1)巩固和加深所学电子技术课程的基本知识, 提高综合

运用所学知识的能力;

2)培养学生根据课题需要选用参考书、查阅手册、图表和文献资料的能力,提高学生独立解决工程实际问题的能力

3)通过设计方案的分析比较、设计计算、元件选绎及电路安装调试等环节.初步掌握单实用电路的工程设计方法. 4)提高学生的动手能力.掌握常用仪器设备的正确使用方法,学会对简单实用电路的实验调试和对整机指标的测试方法,

5)了解与课题有关的电路以及元器件的工程技术规范,能按课程设计任务书的要求编写设计说明书,能正确反映设计和实验成果,能正确绘制电路固等.

二、 设计任务与要求

一) 任务:

1. 显示学号

2. 实现两位数的加减乘除运算

- 4 -

西北工业大学 电子信息学院 08021103班

二) 设计要求:

显示学号:

1. 用四位数码管显示

2. 循环显示同组2人的学号后四位 实现两位数的加减乘除运算: 1. 通过键盘输入待运算数值 2. 采用数码管显示待运算数值 3. 通过VGA显示运算结果

三、 方案设计与论证

学号显示部分:

题目要求采用数码管循环显示学号,则需要对时钟信号进行分频。程序中设置四个4位端口变量sml0,sml1,sml2,sml3,用于控制四个数码管输出。在时钟脉冲下,定义一个3位二进制寄存变量pd,通过计数的方式循环显示学号。即前四个数时给四个数码管输出端口变量赋值,显示一位同学的学号,后四个数时,显示另一位同学学号。定义了一个开关信号,作为学号显示和计算器部分的切换控制。 设计框图如下:

- 5 -

西北工业大学 电子信息学院 08021103班

.vga_b(vga_b) ); Endmodule //计算器模块 module

Verilog1(clk2,rst_n,ps2k_clk,ps2k_data,ps2_byte,ps2_state,sm_db,buff,clk3);

input clk2; //50M时钟信号 input rst_n; //复位信号

input ps2k_clk; //PS2接口时钟信号 input ps2k_data; //PS2接口数据信号 output clk3; output [15:0] buff;

output[31:0] sm_db; //7段数码管寄存器

output[7:0] ps2_byte; // 1byte键值,只做简单的按键扫描

output ps2_state; //键盘当前状态,ps2_state=1表示有键被按下

//------------------------------------------ reg ps2k_clk_r0,ps2k_clk_r1,ps2k_clk_r2; //ps2k_clk状态寄存器

- 16 -

西北工业大学 电子信息学院 08021103班

//wire pos_ps2k_clk; // ps2k_clk上升沿标志位 wire neg_ps2k_clk; // ps2k_clk下降沿标志位 //====================================== reg clk3;

always @ (posedge clk2) begin

clk3 <= !clk3; end

//===================================

always @ (posedge clk2 or negedge rst_n) begin if(!rst_n) begin

ps2k_clk_r0 <= 1'b0; ps2k_clk_r1 <= 1'b0; ps2k_clk_r2 <= 1'b0; end

else begin //锁存状态,进行滤波 ps2k_clk_r0 <= ps2k_clk; ps2k_clk_r1 <= ps2k_clk_r0;

- 17 -

西北工业大学 电子信息学院 08021103班

ps2k_clk_r2 <= ps2k_clk_r1; end end

assign neg_ps2k_clk = ~ps2k_clk_r1 & ps2k_clk_r2; //下降沿

//------------------------------------------ reg[7:0] ps2_byte_r; //PC接收来自PS2的一个字节数据存储器

reg[7:0] temp_data; //当前接收数据寄存器 reg[3:0] num; //计数寄存器

always @ (posedge clk2 or negedge rst_n) begin if(!rst_n) begin num <= 4'd0; temp_data <= 8'd0; end

else if(neg_ps2k_clk) begin //检测到ps2k_clk的下降沿

case (num)

4'd0: num <= num+1'b1; 4'd1: begin

- 18 -

西北工业大学 电子信息学院 08021103班

num <= num+1'b1;

temp_data[0] <= ps2k_data; //bit0 end 4'd2: begin

num <= num+1'b1;

temp_data[1] <= ps2k_data; end 4'd3: begin

num <= num+1'b1;

temp_data[2] <= ps2k_data; end 4'd4: begin

num <= num+1'b1;

temp_data[3] <= ps2k_data; end 4'd5: begin

num <= num+1'b1;

temp_data[4] <= ps2k_data; end 4'd6: begin

num <= num+1'b1;

temp_data[5] <= ps2k_data; end

- 19 -

//bit1 //bit2 //bit3 //bit4 //bit5

西北工业大学 电子信息学院 08021103班

4'd7: begin

num <= num+1'b1;

temp_data[6] <= ps2k_data; //bit6 end 4'd8: begin

num <= num+1'b1;

temp_data[7] <= ps2k_data; //bit7 end 4'd9: begin

num <= num+1'b1; //奇偶校验位,不做处理

end 4'd10: begin

num <= 4'd0; // num清零 end default: ; endcase end end

reg key_f0; //松键标志位,置1表示接收到数据8'hf0,

- 20 -

西北工业大学 电子信息学院 08021103班

3:begin rsm_db[15:8]<=ps2_byte;i<=i+1;end

4:begin rsm_db[7:0]<=ps2_byte;i<=i+1;end

5:begin i<=0;end endcase end end

assign sm_db=rsm_db;

//caculator part

reg[15:0] buff; reg[7:0] mm1,mm2; reg[3:0] op;

- 26 -

西北工业大学 电子信息学院 08021103班

reg[7:0] num1,num2; reg eoc; reg[3:0] data2; reg[9:0] data1; reg[5:0] a;

reg [7:0] e=8'b0110_0100; parameter

add=4'b1010,sub=4'b1011,mult=4'b1100,div=4'b1101; integer b;

always @(negedge ps2_state or negedge rst_n ) begin if(!rst_n)

begin buff=0;op=0;eoc=0;num1=0;num2=0;end else begin if(data!=4'b1110) begin

if((data>=4'b0000)&&(data<=4'b1001)) begin case(a) 0:begin

data1=data;buff=data1+data1+data1+data1+data1+data1+data1+data1+data1+data1;a<=a+1;end

- 27 -

西北工业大学 电子信息学院 08021103班

1:begin data2=data;buff=buff+data2;a<=0;end endcase end

else if((data>=4'b1010)&&(data<=4'b1110)) begin op=data;num1=buff[7:0];end //!@!!!! end

else begin if(eoc==0) begin

num2=buff[7:0]; case(op) add: begin

buff=num1+num2; eoc=1; end

- 28 -

西北工业大学 电子信息学院 08021103班

sub:

if (num1>num2) begin buff=num1-num2;eoc=1;end else begin

buff=num2-num1;eoc=1;end mult: begin

buff=num1*num2; eoc=1; end div: begin

if(num2==8'b00000000) buff=0; else begin

mm1=num1/num2; mm2=num1%num2; buff=mm1*e+mm2;

- 29 -

西北工业大学 电子信息学院 08021103班

end eoc=1; end endcase end end end end endmodule

//计算结果分位模块

module sy3(sml,smlq,smlb,smls,smlg); input [15:0] sml;

output [15:0] smlq,smlb,smls,smlg;

reg [15:0] smlq,smlb,smls,smlg,smlbb,smlss; reg [15:0] q=16'b000000_11111_01000; reg [15:0] h=16'b000000_00011_00100; reg [15:0] s=16'b000000_00000_01010; always @(sml) begin

- 30 -

西北工业大学 电子信息学院 08021103班

smlq=sml/q; smlbb=sml%q; smlb=smlbb/h; smlss=sml%h; smls=smlss/s; smlg=sml%s; end

endmodule

//VGA显示模块

module vga( sml000,sml111,sml222,sml333, clk , rst_n, hsync,vsync, vga_r,vga_g,vga_b );

input [15:0] sml000,sml111,sml222,sml333; input clk; //50MHz input rst_n; //低电平复位 output hsync; //行同步信号

- 31 -

西北工业大学 电子信息学院 08021103班

output vsync; //颜色信号线RGB output vga_r; output vga_g; output vga_b;

reg [3:0] sml0000,sml1111,sml2222,sml3333;

//---------------------------------------------------------------------- reg [10:0] x_cnt; //行坐标 reg [9:0] y_cnt; //列坐标

//-----------------------------------------------------------------

wire [12:0]xpos; //有效显示行坐标 wire [12:0]ypos; //有效显示列坐标

//------------------------------------------------------------------

reg hsync_r,vsync_r; //同步信号 wire valid; //有效显示区标志 reg [2:0]vga_rgb; //显示像素颜色 reg [10:0]char1_bit; //取模的位数

//--------------------------------------------------

- 32 -

西北工业大学 电子信息学院 08021103班

----------------- //定义存放数据的寄存器 reg [15:0]char_line0[21:0]; reg [15:0]char_line1[21:0]; reg [15:0]char_line2[21:0]; reg [15:0]char_line3[21:0]; reg [15:0]char_line4[21:0]; reg [15:0]char_line5[21:0]; reg [15:0]char_line6[21:0]; reg [15:0]char_line7[21:0]; reg [15:0]char_line8[21:0]; reg [15:0]char_line9[21:0]; reg [15:0]char_line10[21:0]; reg [15:0]char_line11[21:0]; reg [15:0]char_line12[21:0]; reg [15:0]char_line13[21:0]; reg [15:0]char_line14[21:0]; reg [15:0]char_line15[21:0]; reg [15:0]char_line16[21:0]; reg [15:0]char_line17[21:0]; reg [15:0]char_line18[21:0]; reg [15:0]char_line19[21:0]; reg [15:0]char_line20[21:0];

- 33 -

西北工业大学 电子信息学院 08021103班

reg [15:0]char_line21[21:0]; reg [15:0]char_line22[21:0]; reg [15:0]char_line23[21:0]; reg [15:0]char_line24[21:0]; reg [15:0]char_line25[21:0]; reg [15:0]char_line26[21:0]; reg [15:0]char_line27[21:0]; reg [15:0]char_line28[21:0]; reg [15:0]char_line29[21:0]; reg [15:0]char_line30[21:0]; reg [15:0]char_line31[21:0]; reg [15:0]char_line32[21:0]; reg [15:0]char_line33[21:0]; reg [15:0]char_line34[21:0]; reg [15:0]char_line35[21:0]; reg [15:0]char_line36[21:0]; reg [15:0]char_line37[21:0]; reg [15:0]char_line38[21:0]; reg [15:0]char_line39[21:0]; reg [15:0]char_line40[21:0]; reg [15:0]char_line41[21:0]; reg [15:0]char_line42[21:0]; reg [15:0]char_line43[21:0];

- 34 -

西北工业大学 电子信息学院 08021103班

reg [15:0]char_line44[21:0]; reg [15:0]char_line45[21:0]; reg [15:0]char_line46[21:0]; reg [15:0]char_line47[21:0]; reg [15:0]char_line48[21:0]; reg [15:0]char_line49[21:0]; reg [15:0]char_line50[21:0]; reg [15:0]char_line51[21:0]; reg [15:0]char_line52[21:0]; reg [15:0]char_line53[21:0]; reg [15:0]char_line54[21:0]; reg [15:0]char_line55[21:0]; reg [15:0]char_line56[21:0]; reg [15:0]char_line57[21:0]; reg [15:0]char_line58[21:0]; reg [15:0]char_line59[21:0]; reg [15:0]char_line60[21:0]; reg [15:0]char_line61[21:0]; reg [15:0]char_line62[21:0]; reg [15:0]char_line63[21:0];

//------------------------------------------------------------------------------------- //定义扫描显示的数据,wire型

- 35 -

西北工业大学 电子信息学院 08021103班

wire [147:0]line0; //第1行 wire [147:0]line1; //第2行 wire [147:0]line2; //第3行 wire [147:0]line3; //第4行 wire [147:0]line4; //第5行 wire [147:0]line5; //wire [147:0]line6; //wire [147:0]line7; //wire [147:0]line8; //wire [147:0]line9; //wire [147:0]line10; //wire [147:0]line11; //wire [147:0]line12; //wire [147:0]line13; //wire [147:0]line14; //wire [147:0]line15; //wire [147:0]line16; //wire [147:0]line17; //wire [147:0]line18; //wire [147:0]line19; //wire [147:0]line20; //wire [147:0]line21; //wire [147:0]line22; //

第6行 第7行 第8行 第9行 第10行 第11行 第12行 第13行 第14行 第15行 第16行 第17行 第18行 第19行 第20行 第21行 第22行 第23行

- 36 -

西北工业大学 电子信息学院 08021103班

wire [147:0]line23; //第24行 wire [147:0]line24; //第25行 wire [147:0]line25; //第26行 wire [147:0]line26; //第27行 wire [147:0]line27; //第28行 wire [147:0]line28; //wire [147:0]line29; //wire [147:0]line30; //wire [147:0]line31; //wire [147:0]line32; //wire [147:0]line33; //wire [147:0]line34; //wire [147:0]line35; //wire [147:0]line36; //wire [147:0]line37; //wire [147:0]line38; //wire [147:0]line39; //wire [147:0]line40; //wire [147:0]line41; //wire [147:0]line42; //wire [147:0]line43; //wire [147:0]line44; //wire [147:0]line45; //

第29行 第30行 第31行 第32行 第1行 第2行 第3行 第4行 第5行 第6行 第7行 第8行 第9行 第10行 第11行 第12行 第13行 第14行

- 37 -

西北工业大学 电子信息学院 08021103班

wire [147:0]line46; //第15行 wire [147:0]line47; //第16行 wire [147:0]line48; //第17行 wire [147:0]line49; //第18行 wire [147:0]line50; //第19行 wire [147:0]line51; //第20行 wire [147:0]line52; //第21行 wire [147:0]line53; //第22行 wire [147:0]line54; //第23行 wire [147:0]line55; //第24行 wire [147:0]line56; //第25行 wire [147:0]line57; //第26行 wire [147:0]line58; //第27行 wire [147:0]line59; //第28行 wire [147:0]line60; //第29行 wire [147:0]line61; //第30行 wire [147:0]line62; //第31行 wire [147:0]line63; //第32行

//--------------------------------------------------------------------------------------- wire [25:0]cnt;

reg [25:0]cnt_r; //计数,产生一秒的时间 //--------------------------------------------------

- 38 -

西北工业大学 电子信息学院 08021103班

-------------------------------------

//将0123456789的取模数据存入到寄存器中,16*32 //每个字符将其最上面的数据存到line0中,然后依次往下推

//将数字x的取模数据存到地址为x的寄存器中,例如0的数据就存到地址为0的存储单元中 always begin

char_line0[0] <= 16'h0000; //0 char_line1[0] <= 16'h0000; char_line2[0] <= 16'h0000; char_line3[0] <= 16'h0000; char_line4[0] <= 16'h0000; char_line5[0] <= 16'h0000; char_line6[0] <= 16'h03f0; char_line7[0] <= 16'h0738; char_line8[0] <= 16'h0e1c; char_line9[0] <= 16'h1c0e; char_line10[0] <= 16'h1c0e; char_line11[0] <= 16'h1c06; char_line12[0] <= 16'h3807; char_line13[0] <= 16'h3807; char_line14[0] <= 16'h3807;

- 39 -

的字模 西北工业大学 电子信息学院 08021103班

char_line15[0] <= 16'h3807; char_line16[0] <= 16'h3807; char_line17[0] <= 16'h3807; char_line18[0] <= 16'h3807; char_line19[0] <= 16'h3807; char_line20[0] <= 16'h3807; char_line21[0] <= 16'h1c06; char_line22[0] <= 16'h1c0e; char_line23[0] <= 16'h1c0e; char_line24[0] <= 16'h0e1c; char_line25[0] <= 16'h0738; char_line26[0] <= 16'h03f0; char_line27[0] <= 16'h0000; char_line28[0] <= 16'h0000; char_line29[0] <= 16'h0000; char_line30[0] <= 16'h0000; char_line31[0] <= 16'h0000;

char_line0[1] <= 16'h0000; //1 char_line1[1] <= 16'h0000; char_line2[1] <= 16'h0000; char_line3[1] <= 16'h0000; char_line4[1] <= 16'h0000;

- 40 -

的字模

本文来源:https://www.bwwdw.com/article/98f.html

Top