(Problem 105 12-hour clock)也可以做一做,好像挺不错的
Problem 64 (3.1.2.5)256-to-1 4bit multiplexer(Mux256to1v)
module top_module( input [1023:0] in, input [7:0] sel, output [3:0] out ); assign out = in[sel * 4 +: 4]; //second way //assign out = {in[sel * 4 + 3], in[sel * 4 + 2], in[sel * 4 + 1], in[sel * 4]}; //third way //assign out = in[sel*4+3 -: 4]; // 从 sel*4+3 开始,选择比特序号小于 sel*4+3 的 4 位比特,相当于[sel*4+3:sel*4] endmodule
方法1和方法3本质上是同一种写法,这种写法是verilog 2001标准中新增加的,是向量部分选择的意思,如果sel等于0,in[sel * 4 +: 4]代表从0开始向上(方法3中是向下)数4位,即in[3:0],建议大家学习使用这种方法,在sel位宽较大是可以有效减小工作量。
problem 69 3.1.3.5 Signed addition overflow(Exams/ece241 2014 q1c)
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] & ~b[7] & s[7]; endmodule
大家注意,这道题的溢出判断需要想一想,其实原理就是如果两个数都为负数,那个相加一定为负数,但是最终s的最高位不是1,那就证明溢出了,两个数都是正数同理。(好像这道题跟补码计算有关,看看笔记吧)
da
Problem 102 Counter 1-12
//题目提供的4-bit计数器代码
module count4(
input clk,
input enable,
input load,
input [3:0] d,
output reg [3:0] Q
);
答案:
assign c_enable = enable;
//带复位和置位,
assign c_load = reset | (Q == 4'd12 & enable == 1'b1);
assign c_d = c_load?4'b1:4'b1010;
count4 Inst_count4
(.clk(clk),
.enable(c_enable),
.load(c_load),
.d(c_d),
.Q(Q));
其中第三次赋值的 c_d = c_load?4'b1:4'b1010;
在程序中的意思是,在复位后计数器从1开始计数(迎合题意),不复位c_d =10(这里无意义,因为不复位,就不把c_d赋值给计数器)
Problem 114 3.2.3.9 3-input LUT
module top_module ( input clk, input enable, input S, input A, B, C, output reg Z ); reg[7:0] shift_reg; always@(posedge clk)begin if(enable)begin shift_reg <= {S,shift_reg[7:1]}; end end wire[2:0] output_index = {A,B,C}; always@(*) begin case(output_index) 3'd0:Z=shift_reg[7]; 3'd1:Z=shift_reg[6]; 3'd2:Z=shift_reg[5]; 3'd3:Z=shift_reg[4]; 3'd4:Z=shift_reg[3]; 3'd5:Z=shift_reg[2]; 3'd6:Z=shift_reg[1]; 3'd7:Z=shift_reg[0]; endcase end endmodule
本题中实现的是一个和 8x1 结构的存储体相关的电路。存储的输入通过移入比特进行,存储的读取类似于传统 RAM 中的随机读取,即可以指定读出比特的位置,通过 3 个输入端口指定读取位置。
首先通过 8 个触发器实现一个 8bit 深的移位寄存器。8个寄存器的输出依次为 Q[0]...Q[7]。移位寄存器的输入为 S,输入首先会填充到 MSB(最高位),Q[0]。当 enable 信号控制移位,当其有效时输入数据并移位。此外,该电路有三个输入端口 A,B,C 以及输出端口 Z。工作的功能如下:当 ABC = 000 时,Z = Q[0],当 ABC = 001 时,Z = Q[1],以此类推。你的电路中只能包括一个 8bit 移位寄存器以及一个多路选择器。(这就是个三输入查找表 LUT 电路)