FPGA计算器实现心得

学习编写四则运算小计算器过程小心得

      《四则运算计算器设计实例》是我在图书馆发现的一本书,也是我用来入门Verilog和FPGA的书,个人认为通过仿照已经实现的项目,可以更好更快的入门FPGA,由于正在上学,课程比较多,这学期又同时开了模电和数电这两门比较重要的课,所以我现在学习就像打游击战一样,只能通过课余的一点点时间来自学,学的很慢那是必然的,好了,接下来是我对这段时间的学习做一下总结。
       书一共有10章,按作者的意思是一天一章,第一章是数码管的显示设计,由于我学过单片机编程,经常出错的也就是语法方面。这第一次编程说简单其实也很简单,不过Verilog的编程真的很不一样,虽然正式学之前听说过Verilog属于硬件描述语言,属于模块和并发性,然而学到输入状态机那一章是出现了一个问题,也应该是硬件编程经常遇到的一个问题,那就是出现的bug不一定是错误提示的地方,而是其他模块里面,这就很无奈了。(觉得这是新手经常遇到的问题,熟悉后不知道会不会也是这样,毕竟我这是语法问题)
       通过前三章的模仿学习,已经熟练掌握了基本的工程创建、仿真、波形分析、以及基本的Verilog语法和如何添加各种altera提供的硬件模块,初步了解了可综合的思想,需要更加深入的学习,最后,在此感谢资源分享,让我如此菜鸟在汪洋大海中不至于跑丢了。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个基本的FPGA计算器,它可以实现加、减、乘、除四个基本运算,并将结果显示在LCD上。 首先,需要定义输入和输出的信号,以及计算器的状态。在本例中,我们使用4位二进制数作为输入和输出,使用3位二进制数表示计算器的状态。 ``` module calculator( input [3:0] op1, input [3:0] op2, input [2:0] state, output reg [3:0] result, output reg rs, rw, en, output reg [7:0] addr, output reg [7:0] data ); ``` 然后,需要定义四个模块,分别实现加、减、乘、除四个基本运算。在这里,我们使用了if-else语句实现不同运算的逻辑。 ``` module adder( input [3:0] a, input [3:0] b, output reg [3:0] c ); always @(*) begin c = a + b; end endmodule module substractor( input [3:0] a, input [3:0] b, output reg [3:0] c ); always @(*) begin c = a - b; end endmodule module multiplier( input [3:0] a, input [3:0] b, output reg [3:0] c ); always @(*) begin c = a * b; end endmodule module divider( input [3:0] a, input [3:0] b, output reg [3:0] c ); always @(*) begin c = a / b; end endmodule ``` 接下来,需要在主模块中实现计算器的控制逻辑。首先,根据状态选择运算模块,并将输入信号传递给运算模块。然后,将计算结果传递给输出信号,并通过LCD显示出来。 ``` adder add(op1, op2, result); substractor sub(op1, op2, result); multiplier mul(op1, op2, result); divider div(op1, op2, result); always @(*) begin case(state) 3'b000: adder add(op1, op2, result); 3'b001: substractor sub(op1, op2, result); 3'b010: multiplier mul(op1, op2, result); 3'b011: divider div(op1, op2, result); default: result = 4'b0000; endcase end always @(posedge clk) begin if (en == 1 && rw == 0) begin case(addr) 8'h00: op1 <= data; 8'h01: op2 <= data; 8'h02: state <= data[2:0]; default: ; endcase end end always @(posedge clk) begin if (en == 1 && rw == 1) begin case(addr) 8'h00: data <= op1; 8'h01: data <= op2; 8'h02: data <= state; 8'h03: data <= result; default: data <= 8'b00000000; endcase end end always @(posedge clk) begin if (en == 1) begin rs <= 0; rw <= 0; addr <= 8'b00000000; case(state) 3'b000: addr <= 8'h00; // op1 3'b001: addr <= 8'h01; // op2 3'b010: addr <= 8'h02; // state 3'b011: addr <= 8'h03; // result default: ; endcase data <= result; end else begin rs <= 1; rw <= 0; addr <= 8'b00000000; data <= 8'b00000000; end end ``` 最后,在主模块中需要定义时钟信号和LCD控制信号,并将它们与计算器的输入输出信号连接起来。 ``` reg clk; reg [15:0] count = 0; assign en = (count[15] == 1'b1); assign addr = count[14:7]; assign data = result; always @(posedge clk) begin count <= count + 1; end lcd_controller lcd(clk, rs, rw, en, addr, data); ``` 这就是一个简单的FPGA计算器,并将结果显示在LCD上的程序。需要注意的是,这只是一个示例程序,具体的实现方式可能会因为硬件平台和LCD控制器的不同而有所差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值