一、译码器的学习
译码器定义:简单来说就是将输入的二进制代码状态翻译成输出信号,以此来表示原来的含义的电路。译码器可以分为两大类
(1)变量译码
输入n个则最多输出为2的n次方个,比如38译码器,输入为2,则输出最多为2的3次方,即为8
(2)显示译码
将对应的二进制代码转换为7段码,一般用于驱动led或者lcd

1.其过程和之前的类似,先建立四个文件夹,然后绘制visio波形,编写代码等过程不在赘述,参考前面

译码器实现JAVA 译码器实现半加器_fpga/cpld

代码可以用if-else语句来实现也可以用case语句来实现,两者区别比较大,第一种生成的rtl电路比较复杂,占用很大的内存。而第二种使用case语句电路简单并且占用资源较小
2.程序
程序文件

module decoder
 (
 input wire in1,
 input wire in2,
 input wire in3,output reg [7:0] out
);
 always@(*)
 case({in1,in2,in3})
 3’b000: out = 8’b0000_0001;
 3’b001: out = 8’b0000_0010;
 3’b010: out = 8’b0000_0100;
 3’b011: out = 8’b0000_1000;
 3’b100: out = 8’b0001_0000;
 3’b101: out = 8’b0010_0000;
 3’b110: out = 8’b0100_0000;
 3’b111: out = 8’b1000_0000;
 default: out = 8’b0000_0000;
 endcase
 endmodule

测试文件

`timescale 1ns/1ns
module tb_decoder();
reg in1;
 reg in2;
 reg in3;wire[7:0] out;
initial
 begin
 in1 <= 1’b0;
 in2 <= 1’b0;
 in3 <= 1’b0;
 endalways #10 in1 <= {KaTeX parse error: Expected 'EOF', got '}' at position 7: random}̲ % 2; always #1…random} % 2;
 always #10 in3 <= {$random} % 2;initial
 begin
 $timeformat(-9,0,“ns”,6);
time,in1,in2,in3,out);
 enddecoder decoder_inst
 (
 .in1(in1),
 .in2(in2),
 .in3(in3),
 .out(out));
endmodule

二、半加器

半加器定义:半加器电路是指对两个输入数据位相加,输出一个结果位和进位,没有进位输入的加法器电路。是实现两个一位二进制数的加法运算电路。

全加器是在半加器的基础上的升级版,除了加数和被加数加和外还要加上上一级传进来的进位信号。

1.visio分析视图

译码器实现JAVA 译码器实现半加器_译码器_02

2.代码
程序代码

module half_adder
 (
 input wire in1,
 input wire in2,
 /*
 output reg sum,
 output reg count*/
 output wire sum,
 output wire count);
assign {count,sum} = in1 + in2;
/*
 always@(*)
 case({in1,in2})
 2’b00: {sum,count} = 2’b00;
 2’b01: {sum,count} = 2’b10;
 2’b10: {sum,count} = 2’b10;
 2’b11: {sum,count} = 2’b01;
 default:{sum,count} = 2’b00;
 endcase
 *//* 与上一种情况一样
 always@(*)
 case({in1,in2})
 2’b00:begin sum=0;count=0; end
 2’b01:begin sum=1;count=0; end
 2’b10:begin sum=1;count=0; end
 2’b11:begin sum=0;count=1; end
 default:begin sum=0;count=0; end
 endcase
 */
 endmodule测试代码
 `timescale 1ns/1nsmodule tb_half_adder ();
reg in1;
 reg in2;wire sum;
 wire count;initial
 begin
 in1 <= 1’b0;
 in2 <= 1’b1;
 endalways #10 in1 <= (KaTeX parse error: Expected 'EOF', got '#' at position 21: …m) %2; always #̲10 in2 <= (random) %2;
initial
 begin
 $timeformat(-9,0,“ns”,6);
time,in1,in2,sum,count);
 endhalf_adder half_adder_inst
 (
 .in1(in1),
 .in2(in2),.sum(sum),
 .count(count));
endmodule

三、modelsim技巧

1.在波形图界面上,输入输出信号带路径,比较难以区分,可以去掉路径。只显示信号名称

译码器实现JAVA 译码器实现半加器_fpga/cpld_03

2.modelsim窗口混乱问题,可以按照下面的步骤,对窗口进行一键还原

译码器实现JAVA 译码器实现半加器_程序代码_04

3.在波形窗口界面可以将测试模块与模块的波形同时显示在上面,

译码器实现JAVA 译码器实现半加器_译码器实现JAVA_05

4.测试文件和模块都在波形界面上,但是比较容易混淆,可以多两者进行分组区分,只需要选中想要分组的选项,然后按下快捷键ctrl+g即可完成分组

译码器实现JAVA 译码器实现半加器_译码器_06