3译码器与半加器的学习

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

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

代码可以用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;
end

always #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);
m o n i t o r ( " @ t i m e monitor("@time %t:in1=%b,in2=%b,in3=%b,out=%b", monitor("@timetime,in1,in2,in3,out);
end

decoder decoder_inst
(
.in1(in1),
.in2(in2),
.in3(in3),
.out(out)

);

endmodule

二、半加器
半加器定义:半加器电路是指对两个输入数据位相加,输出一个结果位和进位,没有进位输入的加法器电路。是实现两个一位二进制数的加法运算电路。
全加器是在半加器的基础上的升级版,除了加数和被加数加和外还要加上上一级传进来的进位信号。
1.visio分析视图
在这里插入图片描述

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/1ns

module tb_half_adder ();

reg in1;
reg in2;

wire sum;
wire count;

initial
begin
in1 <= 1’b0;
in2 <= 1’b1;
end

always #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);
m o n i t o r ( " @ t i m e monitor("@time %t:in1=%b,in2=%b,sum=%b,count=%b", monitor("@timetime,in1,in2,sum,count);
end

half_adder half_adder_inst
(
.in1(in1),
.in2(in2),

.sum(sum),
.count(count)

);

endmodule

三、modelsim技巧
1.在波形图界面上,输入输出信号带路径,比较难以区分,可以去掉路径。只显示信号名称
在这里插入图片描述

2.modelsim窗口混乱问题,可以按照下面的步骤,对窗口进行一键还原
在这里插入图片描述

3.在波形窗口界面可以将测试模块与模块的波形同时显示在上面,
在这里插入图片描述

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值