1单选(2分)
常数可以用简单的十进制数格式书写,也可以按基数格式书写
[size] ’ base value
size是位宽,base是基数,value是基于base的值的数字序列:
o或O表示八进制
b或B表示二进制
d或D表示十进制
h或H表示十六进制
下面不正确的描述是( )
得分/总分
A.7’Hx
B.4’D9
C.4’hz
D.5’O28
正确答案:D
2单选(2分)
存储器可以由reg变量组成的数组描述,
例如:reg [0:3] MEM [0:63]; 表示MEM是一个由64个4位reg变量组成的数组。
下面赋值中错误的是()。
得分/总分
A.
reg [7:0] mem_a [63:0], mem_b[63:0]; integer i; for(i=0;i<64; i=i+1) mem_ai=mem_b[i];
B.
reg [1:5] qburst; qburst=5'b11011;
C.
reg [0:3] xp_rom [1:4]; xp_rom[1]=4'hA; xp_rom[2]=4'h8; xp_rom[3]=4'hF; xp_rom[4]=4'h2;
D.
reg hold_gnt [1:5]; hold_gnt=5'b11011;
正确答案:D
3单选(2分)
<<是()运算符,如果有下面的定义:
reg [7:0] qreg; qreg = 8'h17;
则:qreg<<2的结果是()。
得分/总分
A.右移,8’b01011100
B.右移,8’b00000101
C.左移,8’b01011100
D.左移,8’b00000101
正确答案:C
4单选(2分)
是()运算符,表达式28的值是()?
得分/总分
A.没有此运算符
B.乘法,16
C.取模,2
D.求幂,256
正确答案:D
5单选(2分)
下面对局部参数的说明错误的是()
得分/总分
A.实例引用该模块时,可以通过参数传递对局部参数进行修改2.00/2.00
B.局部参数是模块内部的参数
C.局部参数可以用其它非局部参数定义
D.局部参数所用的关键词为localparam
正确答案:A
6单选(2分)
实验内容1要求设计一个16*8的ROM实现七段译码器,用存储器的____位地址作为七段译码器的____,相应存储单元的____位数据作为七段译码器的____,每个存储单元中初始化为字符的____.
得分/总分
A.4,数据输入,8,译码输出,数码管段码
B.8,译码输出,16,数据输入,数码管段码
C.8,译码输出,4,数据输入,数码管段码
D.16,数据输入,8,译码输出,数码管段码
正确答案:A
7单选(2分)
实验内容2用32*32的RAM实现寄存器堆,选出合适的存储器描述
得分/总分
A.
localparam MEMDEPTH=1<<5 logic [31:0] mem MEMDEPTH->
B.
localparam MEMDEPTH=1<<5 logic mem MEMDEPTH>
C.
localparam MEMDEPTH=2**5; logic [4:0] mem [0:MEMDEPTH-1];
D.
localparam MEMDEPTH=32; logic [31:0] mem [0:MEMDEPTH];
正确答案:A
8多选(3分)
小结使用FPGA片内存储资源设计存储器,有哪些特点
得分/总分
A.可生成的容量较大
B.读出需要时钟
C.不占用逻辑资源
D.较好保证存储器性能
正确答案:A、B、C、D你选对了
9判断(2分)
使用Intel FPGA 设计逻辑电路时,存储器的不同描述方法对FPGA资源的利用不同,可以在综合报告中查看资源的使用情况,FPGA内部有专门的存储资源,设计时建议使用FPGA存储资源。
得分/总分
A.√
B.×
正确答案:A
10判断(2分)
下面的两种存储器的描述方法:
方法1
module RAM #( parameter ADDRWIDTH=6, parameter DATAWIDTH =32) ( input wire iclk,iWR, input wire [5:0] iAddress, input iWriteData, output oReadData ); localparam MEMDEPTH=1<<ADDRWIDTH; logic [DATAWIDTH -1:0] mem [0:MEMDEPTH-1]; always_ff@(posedge iclk) begin if (iWR) mem[iAddress]<=iWriteData; end assign oReadData=mem[iAddress]; endmodule
方法2
module RAM #( parameter ADDRWIDTH=6, parameter DATAWIDTH =32) ( input wire iclk,iWR, input wire [5:0] iAddress, input iWriteData, output oReadData ); localparam MEMDEPTH=1<<ADDRWIDTH; logic [DATAWIDTH -1:0] mem [0:MEMDEPTH-1]; logic [DATAWIDTH -1:0] read_addr; always_ff@(posedge iclk) begin read_addr<=iAddress; if (iWR) mem[iAddress]<=iWriteData; end assign oReadData=mem[read_addr]; endmodule
第一种描述方法会消耗较多FPGA逻辑资源;
第二种描述方法会使用FPGA内部存储资源。
得分/总分
A.×
B.√
正确答案:B
解析:第二种方法增加了读地址锁存,编译器使用FPGA的RAM块生成存储器
11判断(2分)
initial语句可用于给存储器设置初值
得分/总分
A.×
B.√
正确答案:B
12判断(2分)
logic [DATAWIDTH -1:0] mem [0:MEMDEPTH-1];
下面的initial语句块中,使用系统函数从把文件内容读出,填入mem数值,这个文件的值是使用2进制表示的。
initial begin $readmemh("init_mem.txt",mem);
得分/总分
A.×
B.√
正确答案:A
解析:init_mem.txt的内容范例:@00 11000000@01 11111001@02 10110011@0A 10110100@0F 10001000@后面表示地址,地址用十六进制表示,数据可以用2进制也可以用16进制表示,如果使用2进制表示数据,使用 $readmemb读出文件如果使用16进制表示数据,使用 $readmemh读出文件
实验代码
使用rom时的virtualboard
`default_nettype none module VirtualBoard ( input logic CLOCK, // 10 MHz Input Clock input logic [19:0] PB, // 20 Push Buttons, logical 1 when pressed input logic [35:0] S, // 36 Switches output logic [35:0] L, // 36 LEDs, drive logical 1 to light up output logic [7:0] SD7, // 8 common anode Seven-segment Display output logic [7:0] SD6, output logic [7:0] SD5, output logic [7:0] SD4, output logic [7:0] SD3, output logic [7:0] SD2, output logic [7:0] SD1, output logic [7:0] SD0 ); /** The input port is replaced with an internal signal **/ wire [3:0] hexData = S[11:8]; /************* The logic of this experiment *************/ wire [7:0] segData; ROM ssdecode_inst(.iAddress(hexData), .oData(segData)); /****** Internal signal assignment to output port *******/ assign SD1 = segData; assign L[7:0]=segData; endmodule
ROM
module ROM #( parameter ADDRWIDTH = 4, parameter DATAWIDTH = 8) ( input logic [ADDRWIDTH-1:0] iAddress, output logic [DATAWIDTH-1:0] oData ); localparam MEMDEPTH = 1<<ADDRWIDTH; logic [DATAWIDTH-1:0] mem[0:MEMDEPTH-1]; assign oData = mem[iAddress]; initial begin // $readmemb("init_mem.txt",mem); // 如果文件中的数据是十六进制,用 $readmemh /* 也可以采用如下代码代替上面的readmemh mem[n'h00] = n'...; ...... */ mem[4'h0]=8'b11000000; mem[4'h1]=8'b11111001; mem[4'h2]=8'b10100100; mem[4'h3]=8'b10110000; mem[4'h4]=8'b10011001; mem[4'h5]=8'b10010010; mem[4'h6]=8'b10000010; mem[4'h7]=8'b11111000; mem[4'h8]=8'b10000000; mem[4'h9]=8'b10010000; mem[4'hA]=8'b10001000; mem[4'hB]=8'b10000011; mem[4'hC]=8'b11000110; mem[4'hD]=8'b10100001; mem[4'hE]=8'b10000110; mem[4'hF]=8'b10001110; end endmodule
使用RAM时的virtualboard
`default_nettype none module VirtualBoard ( input logic CLOCK, // 10 MHz Input Clock input logic [19:0] PB, // 20 Push Buttons, logical 1 when pressed input logic [35:0] S, // 36 Switches output logic [35:0] L, // 36 LEDs, drive logical 1 to light up output logic [7:0] SD7, // 8 common anode Seven-segment Display output logic [7:0] SD6, output logic [7:0] SD5, output logic [7:0] SD4, output logic [7:0] SD3, output logic [7:0] SD2, output logic [7:0] SD1, output logic [7:0] SD0 ); /********* Seven-segment decoder instantiation **********/ logic [3:0] HD[7:0]; // 8 hexadecimal display SevenSegDecode ssdecode_inst7(.iData(HD[7]), .oSeg(SD7)); SevenSegDecode ssdecode_inst6(.iData(HD[6]), .oSeg(SD6)); SevenSegDecode ssdecode_inst5(.iData(HD[5]), .oSeg(SD5)); SevenSegDecode ssdecode_inst4(.iData(HD[4]), .oSeg(SD4)); SevenSegDecode ssdecode_inst3(.iData(HD[3]), .oSeg(SD3)); SevenSegDecode ssdecode_inst2(.iData(HD[2]), .oSeg(SD2)); SevenSegDecode ssdecode_inst1(.iData(HD[1]), .oSeg(SD1)); SevenSegDecode ssdecode_inst0(.iData(HD[0]), .oSeg(SD0)); /** The input port is replaced with an internal signal **/ wire reset = PB[0]; wire clk = PB[1]; wire write_enable=S[6]; wire [3:0] write_data = S[11:8]; wire [1:0] address1 = S[1:0]; wire [1:0] address2 = S[3:2]; logic [3:0] RA1; logic [3:0] RA2; wire [1:0] WA=S[5:4]; /************* The logic of this experiment *************/ RAM #(.ADDRWIDTH(2), .DATAWIDTH(4)) mem(.iClk(clk), .iWR(write_enable), .iWA(WA), .iAddress1(address1), .iAddress2(address2),.iWriteData(write_data), .oReadData1(RA1),.oReadData2(RA2)); /****** Internal signal assignment to output port *******/ assign HD[4] = RA1[3:0]; assign HD[5] = RA2[3:0]; endmodule
RAM
module RAM #( parameter ADDRWIDTH = 6, parameter DATAWIDTH = 32) ( input wire iClk, iWR, input wire [ADDRWIDTH-1:0] iAddress, input wire [DATAWIDTH-1:0] iWriteData, output wire [DATAWIDTH-1:0] oReadData ); localparam MEMDEPTH = 1<<ADDRWIDTH; //存储器的字数 logic [DATAWIDTH-1:0] mem[0:MEMDEPTH-1]; always_ff @(posedge iClk) begin if (iWR) mem[iAddress] <= iWriteData; end assign oReadData = mem[iAddress]; // 读地址未锁存,编译器使用FPGA的逻辑资源生成存储器 /* initial 为了调试方便可给存储器赋初值,调试成功后将其删除。 $readmemh("init_data.txt",mem); // 存储器内容定义在文件中。 */ endmodule