HDLbits代码答案(3.1 Combinational Logic)持更
2020-04-22 13:10
573 查看
目录
- 3.Circuits
- 3.1Combinational Logic
- 3.1.1Basic Gates
- 3.1.2 Multiplexers
- 3.1.3 Arithmetic Circuits
- 3.1.4 Karnaugh Map to Circuit
3.Circuits
3.1Combinational Logic
3.1.1Basic Gates
- Wire
module top_module ( input in, output out); assign out = in; endmodule
- GND
module top_module ( output out); assign out = 1'b0; endmodule
- NOR
module top_module ( input in1, input in2, output out); assign out =~(in1 | in2); endmodule
- Another gate
module top_module ( input in1, input in2, output out); assign out = in1 & (~in2); endmodule
- Two gates
module top_module ( input in1, input in2, input in3, output out); assign out = in3 ^ ~(in1^in2); endmodule
- More logic gates
module top_module( input a, b, output out_and, output out_or, output out_xor, output out_nand, output out_nor, output out_xnor, output out_anotb ); assign out_and = a & b; assign out_or = a | b; assign out_xor = a ^ b; assign out_nand = ~ (a & b); assign out_nor = ~ (a | b); assign out_xnor = ~ (a ^ b); assign out_anotb = a & ~b; endmodule
- 7420 chip
module top_module ( input p1a, p1b, p1c, p1d, output p1y, input p2a, p2b, p2c, p2d, output p2y ); assign p2y = ~(p2a & p2b & p2c & p2d); assign p1y = ~(p1a & p1b & p1c & p1d); endmodule
- Truth tables
module top_module( input x3, input x2, input x1, // three inputs output f // one output ); wire [2:0]mid; assign mid = {x3,x2,x1}; always@(*) begin case(mid) 3'b000,3'b001,3'b100,3'b110: f = 0; 3'b010,3'b011,3'b101,3'b111: f = 1; default:; endcase end endmodule
- Two-bit equality
module top_module ( input [1:0] A, input [1:0] B, output z ); assign z = (A == B)?1:0; endmodule
- Simple circuit A
module top_module (input x, input y, output z); assign z = (x^y) & x; endmodule
- Simple circuit B
module top_module ( input x, input y, output z ); assign z = ~(x ^ y); endmodule
- Combine circuits A and B
task相关使用:https://www.cnblogs.com/lianjiehere/p/4018926.html,有代码使用task解决了此问题。
module top_module (input x, input y, output z); wire z1,z2,z3,z4; A IA1(.x(x), .y(y), .z(z1)); B IB1(.x(x), .y(y), .z(z2)); A IA2(.x(x), .y(y), .z(z3)); B IB2(.x(x), .y(y), .z(z4)); assign z = (z1 | z2) ^ (z3 & z4); endmodule module A (input x, input y, output z); assign z = (x^y) & x; endmodule module B ( input x, input y, output z ); assign z = ~(x ^ y); endmodule
- Ring or vibrate?
module top_module ( input ring, input vibrate_mode, output ringer, // Make sound output motor // Vibrate ); assign ringer = ring & ~vibrate_mode; assign motor = ring & vibrate_mode; endmodule
- Thermostat
module top_module ( input too_cold, input too_hot, input mode, input fan_on, output heater, output aircon, output fan ); assign fan = fan_on | aircon | heater; assign aircon = ~mode & too_hot; assign heater = mode & too_cold; endmodule
- 3-bit population count
module top_module( input [2:0] in, output [1:0] out ); always @(*) begin out = 2'b0; for(integer i=0; i<3; i=i+1) begin //这里i<3,而不是8 if (in[i]) out = out + 1'b1; else out = out + 1'b0; end end endmodule
- Gates and vectors
module top_module( input [3:0] in, output [2:0] out_both, output [3:1] out_any, output [3:0] out_different ); always@(*) begin for(integer i=0;i<3;i=i+1) begin out_both[i] = in[i] & in[i+1]; out_any[i+1] = in[i+1] | in[i]; out_different[i] = in[i] ^ in[i+1]; end out_different[3] = in[3] ^ in[0]; end endmodule
- Even longer vectors
module top_module( input [99:0] in, output [98:0] out_both, output [99:1] out_any, output [99:0] out_different ); always@(*) begin for(integer i=0;i<99;i=i+1) begin out_both[i] = in[i] & in[i+1]; out_any[i+1] = in[i+1] | in[i]; out_different[i] = in[i] ^ in[i+1]; end out_different[99] = in[99] ^ in[0]; end endmodule
3.1.2 Multiplexers
- 2-to-1 multiplexer
module top_module( input a, b, sel, output out ); assign out = sel?b:a; endmodule
- 2-to-1 bus multiplexer
module top_module( input [99:0] a, b, input sel, output [99:0] out ); assign out = sel?b[99:0]:a[99:0]; endmodule
- 9-to-1 multiplexer
module top_module( input [15:0] a, b, c, d, e, f, g, h, i, input [3:0] sel, output [15:0] out ); always@ (*) begin case(sel) 4'd0: out=a; 4'd1: out=b; 4'd2: out=c; 4'd3: out=d; 4'd4: out=e; 4'd5: out=f; 4'd6: out=g; 4'd7: out=h; 4'd8: out=i; default: out=16'hffff; endcase end endmodule
- 256-to-1 multiplexer //256-1mux
module top_module( input [255:0] in, input [7:0] sel, output out ); assign out = in[sel]; endmodule
- 256-to-1 4-bit multiplexer
[ ]的常数表达:[base -: width]
module top_module( input [1023:0] in, input [7:0] sel, output [3:0] out ); assign out = in[sel*4+3 -: 4]; // assign out = in[sel*4+3:sel*4];这一句是错误的,assign[必须是常数] endmodule
截图来自百度:
3.1.3 Arithmetic Circuits
- Half adder
module top_module( input a, b, output cout, sum ); assign {cout,sum} = a +b; endmodule
- Full adder //全加器
module top_module( input a, b, cin, output cout, sum ); assign sum = a ^ b ^ cin; assign cout = a & b | a & cin | cin & b; endmodule
- 3-bit binary adder
module top_module( input [2:0] a, b, input cin, output [2:0] cout, output [2:0] sum ); reg [2:0] Rcout,Rsum; task fa; input a,b,cin; output reg Rcout,Rsum; begin Rcout = a & b| a&cin |b&cin; Rsum = a ^ b ^ cin; end endtask always@(*) begin fa (a[0],b[0],cin,Rcout[0],Rsum[0]); //task输出必须是reg fa (a[1],b[1],cout[0],Rcout[1],Rsum[1]); fa (a[2],b[2],cout[1],Rcout[2],Rsum[2]); sum = {Rsum[2],Rsum[1],Rsum[0]}; cout = {Rcout[2],Rcout[1],Rcout[0]}; end endmodule
- Adder
module top_module ( input [3:0] x, input [3:0] y, output [4:0] sum); wire cin; wire [3:0]cout; assign cin = 1'b0; assign sum[0] = x[0] ^ y[0] ^ cin; assign cout[0] = x[0] & y[0]; always@(*) begin for(integer i =1;i<4;i=i+1) begin sum[i] = x[i] ^ y[i] ^ cout[i-1]; cout[i] = x[i] & y[i] | x[i] & cout[i-1] | y[i] & cout[i-1]; end end assign sum[4:0] = {cout[3],sum[3:0]}; endmodule
- Signed addition overflow
module top_module ( input [7:0] a, input [7:0] b, output [7:0] s, output overflow ); assign s = a + b; assign overflow = ((a[7]==b[7])&(s[7]!=a[7]))?1'b1:1'b0; //当最高位(符号位)和次高位carry项结果不同时,溢出 endmodule
- 100-bit binary adder
module top_module( input [99:0] a, b, input cin, output cout, output [99:0] sum ); assign {cout,sum[99:0]} = a[99:0] + b[99:0] + cin; endmodule
- 4-digit BCD adder
再说亿遍!always块里不可以例化block
module top_module( input [15:0] a, b, input cin, output cout, output [15:0] sum ); wire carry[15:3]; bcd_fadd a_0(.a(a[3:0]), .b(b[3:0]), .cin(cin), .cout(carry[3]), .sum(sum[3:0])); generate genvar i; for(i=7;i<16;i=i+4) begin:GO bcd_fadd a_i (.a(a[i-:4]), .b(b[i-:4]), .cin(carry[i-4]), .cout(carry[i]), .sum(sum[i-:4])); end endgenerate assign cout = carry[15]; endmodule
3.1.4 Karnaugh Map to Circuit
- 3-variable
module top_module( input a, input b, input c, output out ); assign out = a | b | c; endmodule
- 4-variable
module top_module( input a, input b, input c, input d, output out ); assign out = ~((a & c & ~d) | (a & b & ~c) | (~a & b & ~c & d) | (~a & ~b & c & d)); endmodule
- 4-variable
module top_module( input a, input b, input c, input d, output out ); assign out = a | (~a & ~b & c); endmodule
- 4-variable
module top_module( input a, input b, input c, input d, output out ); assign out = (~c & ~d & (~a & b | a & ~b)) | (~c & d & (~a & ~b | a & b)) | (c & d & (~a & b | a & ~b)) | (c & ~d & (~a&~b | a&b)); endmodule
- Minimum SOP and POS
module top_module ( input a, input b, input c, input d, output out_sop, output out_pos ); assign out_sop = c & d | ~a & ~b & c & ~d; assign out_pos = out_sop; endmodule
- Karnaugh map
module top_module ( input [4:1] x, output f ); assign f = ~x[3] & x[1] & x[2] | ~x[1] & x[3]; endmodule
- Karnaugh map
SOP是1的情况或,POS是0的情况与。
module top_module ( input [4:1] x, output f ); assign f = (~x[1] & x[3]) | (~x[4] & x[1] & ~x[2]) | (x[1] & x[2] & x[3] & x[4]) | (~x[1] & ~x[2] & ~x[3] & ~x[4]); endmodule
- K-map implemented with a multiplexer//用mux实现卡诺图
module top_module ( input c, input d, output [3:0] mux_in ); assign mux_in[0] = c | d; assign mux_in[1] = 1'b0; assign mux_in[2] = ~c & ~d | c & ~d; assign mux_in[3] = c & d; endmodule
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- HDLBits 代码输出(一)
- ZedBoard学习(6)-System Generator实现串口通信(一行HDL代码都不用写)
- java面试题及答案(基础题122道,代码题19道)
- 《C++编程思想》第二章 数 据 抽 象(原书代码+习题+答案)
- java面试题及答案(基础题122道,代码题19道)
- java面试题及答案(基础题122道,代码题19道)
- 快学scala 第十一章 操作符 读书笔记及习题答案代码
- 经典面试题(一)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 吴恩达机器学习Week_4 ex3课后编程作业代码作业答案
- 深入理解 GNU GRUB - 03 diskboot.S 3.1 diskboot.S执行时的环境 & 3.2 diskboot.S代码结构
- java面试题及答案(基础题122道,代码题19道)
- UVa11624大火蔓延的迷宫(代码觉得没问题,但是对答案是3有疑惑,而且没有在oj上验证)
- java面试题及答案(基础题122道,代码题19道)
- 第三章 3.1 精通HDL语言:Verilog,VHDL -序
- java面试题及答案(基础题122道,代码题19道)
- java面试题及答案(基础题122道,代码题19道)
- 经典面试题(一)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 常见JAVA代码查错题及答案
- sicp习题答案和范例代码 - 第一章
- ZedBoard学习(6)-System Generator实现串口通信(一行HDL代码都不用写)