Verilog HDL 实验题
文章目錄
- Verilog HDL 實驗
- 實驗一 Modelsim的使用
- 1.實現一個2選1數據選擇器
- 2.D觸發器
- 3.設計4選1的數據選擇器電路
- 實驗二 數據選擇器的設計與vivado集成開發環境
- 1.用VerilogHDL語言設計實現4位二選一數據選擇器電路,完成功能仿真
- 2.設計頂層電路,關聯外設,在vivado下完成綜合等設計步驟,下載至Sword實驗系統驗證電路功能,熟悉vivado操作流程。
- 實驗三 數字加法器的設計
- 1.用VerilogHDL語言設計實現4位串行數字加法器和4位并行加法器,在ModelSim上仿真實現。
- 2.生成FPGA設計文件,下載到Sword實驗系統上驗證電路功能。
- 實驗四 數碼管顯示
- 1.采用VerilogHDL語言編程實現輸入4位BCD碼,輸出是8位數碼管顯示碼。
- 2.用Modelsim進行功能仿真。
- 實驗五 計數/定時器的設計
- 1.用VerilogHDL語言設計實現32位加法/減法二進制計數器,在ModelSim上實現功能仿真。
- 2. 生成FPGA設計文件,下載到Sword實驗系統上驗證電路功能。
- 實驗六 移位寄存器的設計
- 1.用VerilogHDL語言設計實現8位帶并行輸入的右移移位寄存器,在ModelSim上實現功能仿真。
- 2.生成FPGA設計文件,下載到Sword實驗系統上驗證電路功能。
- 實驗七 有限狀態機設計
- 1.理解并掌握檢測連續接收“111”的Moore型和Mealy型有限狀態機設計
- 2. 設計并實現掌握檢測連續接收“1111”的Moore型和Mealy型狀態機設計。
- 3.在完成基本實驗的基礎上,嘗試設計檢測接收“1011”的Moore型和Mealy型有限狀態機的狀態轉移圖。然后編寫代碼,在modelsim上仿真測試驗證結果。
- 實驗八 有限狀態機設計
- 1. 用Verilog HDL設計深度為32、位寬為8 bit的單端口RAM,在Modelsim上仿真測試。
- 2.用Verilog HDL設計深度為8、位寬為8 bit的ROM。在Modelsim上仿真測試。
- 3.用Xilinx ISE/Vivado 生成單端口RAM的IP,并編寫測試文件,調試通過。
- 4. 用Xilinx ISE/Vivado 生成單端口ROM的IP,并編寫測試文件,調試通過。
- 5.將設計的RAM下載到FPGA板子上驗證。
Verilog HDL 實驗
實驗一 Modelsim的使用
1.實現一個2選1數據選擇器
2.D觸發器
3.設計4選1的數據選擇器電路
實驗二 數據選擇器的設計與vivado集成開發環境
1.用VerilogHDL語言設計實現4位二選一數據選擇器電路,完成功能仿真
2.設計頂層電路,關聯外設,在vivado下完成綜合等設計步驟,下載至Sword實驗系統驗證電路功能,熟悉vivado操作流程。
實驗三 數字加法器的設計
1.用VerilogHDL語言設計實現4位串行數字加法器和4位并行加法器,在ModelSim上仿真實現。
2.生成FPGA設計文件,下載到Sword實驗系統上驗證電路功能。
實驗四 數碼管顯示
1.采用VerilogHDL語言編程實現輸入4位BCD碼,輸出是8位數碼管顯示碼。
2.用Modelsim進行功能仿真。
3.分別設計4位BCD碼自動生成模塊和BCD碼的譯碼模塊。
4.在頂層文件將2個電路模塊實例化,并進行相應的連線。
5. 在頂層文件將2個電路模塊實例化,并進行相應的連線。
實驗五 計數/定時器的設計
1.用VerilogHDL語言設計實現32位加法/減法二進制計數器,在ModelSim上實現功能仿真。
2. 生成FPGA設計文件,下載到Sword實驗系統上驗證電路功能。
實驗六 移位寄存器的設計
1.用VerilogHDL語言設計實現8位帶并行輸入的右移移位寄存器,在ModelSim上實現功能仿真。
2.生成FPGA設計文件,下載到Sword實驗系統上驗證電路功能。
實驗七 有限狀態機設計
1.理解并掌握檢測連續接收“111”的Moore型和Mealy型有限狀態機設計
parameter ST0 = 4‘b000; //接收到零個1的狀態 parameter ST1 = 4’b001; //接收到一個1的狀態 parameter ST2 = 4‘b010; //接收到兩個1的狀態 parameter ST3 = 4’b100; //接收到三個1的狀態
2. 設計并實現掌握檢測連續接收“1111”的Moore型和Mealy型狀態機設計。
要求:畫出Moore型和Mealy型的狀態轉移圖,并編寫代碼在modelsim上仿真實現。
3.在完成基本實驗的基礎上,嘗試設計檢測接收“1011”的Moore型和Mealy型有限狀態機的狀態轉移圖。然后編寫代碼,在modelsim上仿真測試驗證結果。
實驗八
1.用Verilog HDL設計深度為32、位寬為8 bit的單端口RAM,在Modelsim上仿真測試。
2.用Verilog HDL設計深度為8、位寬為8 bit的ROM。在Modelsim上仿真測試。
3.用Xilinx ISE/Vivado 生成單端口RAM的IP,并編寫測試文件,調試通過。
4.用Xilinx ISE/Vivado 生成單端口ROM的IP,并編寫測試文件,調試通過。
5.用Xilinx ISE/Vivado 生成單端口ROM的IP,并編寫測試文件,調試通過。
實驗一 Modelsim的使用
1.實現一個2選1數據選擇器
設計代碼
module mux21(in1,in2,sel,out);input[3:0]in1,in2;input sel;output[3:0]out;wire[3:0]out;assign out = (!sel)?in1:in2; endmodule測試代碼
module mux21_tb;reg in1,in2;reg sel;wire out;mux21 uut(.in1(in1), .in2(in2),.sel(sel),.out(out));initial beginin1 = 0; in2 = 0; sel = 0;#100 in1 = 1; in2 = 0; sel = 0;#100 in1 = 1; in2 = 1; sel = 1;#100 in1 = 0; in2 = 1; sel = 1;end endmodule2.D觸發器
設計代碼
module dff(din,clk,q);input din,clk;output q;reg q;always @(posedge clk) q<=din; endmodule測試代碼
`timescale 1ns/1ns module dff_tb;reg clk,data_in;wire data_out;dff U1(data_in,clk,data_out);always #5 clk=~clk; initialbeginclk=0;data_in=0; #20 data_in=1;#20 data_in=0;#20 data_in=1;#15 data_in=0;#15 data_in=1;end endmodule3.設計4選1的數據選擇器電路
設計代碼
module mux41(input wire in0,input wire in1,input wire in2,input wire in3,input wire [1:0] sel,output reg out);always@(*)case(sel)2'b00: out=in0;2'b01: out=in1;2'b10: out=in2;2'b11: out=in3;default: out=1'b0;endcase endmodule測試代碼
module mux41_tb;reg in0,in1,in2,in3;reg [1:0] sel;wire out;mux41 uut(.in0(in0), .in1(in1), .in2(in2), .in3(in3),.sel(sel), .out(out));initial beginin0=0;in1=0;in2=0;in3=0; sel=2'b00;#100 in0=1;in1=0;in2=0;in3=0; sel=2'b00;#100 in0=1;in1=0;in2=0;in3=0; sel=2'b01;#100 in0=1;in1=1;in2=0;in3=0; sel=2'b01;#100 in0=1;in1=1;in2=0;in3=0; sel=2'b10;#100 in0=1;in1=1;in2=1;in3=0; sel=2'b10;#100 in0=1;in1=1;in2=1;in3=0; sel=2'b11;#100 in0=1;in1=1;in2=1;in3=1; sel=2'b11;end endmodule實驗二 數據選擇器的設計與vivado集成開發環境
1.用VerilogHDL語言設計實現4位二選一數據選擇器電路,完成功能仿真
設計代碼
module mux21(in1,in2,sel,out);input[3:0]in1,in2;input sel;output[3:0]out;assign out = (!sel)?in1:in2; endmodule2.設計頂層電路,關聯外設,在vivado下完成綜合等設計步驟,下載至Sword實驗系統驗證電路功能,熟悉vivado操作流程。
Vivado頂層代碼
`timescale 1ns / 1psmodule Prep_IO(input wire clk_100mhz,input wire[15:0]SW,output wire led_clk,output wire led_clrn,output wire led_sout,output wire LED_PEN );wire[31:0]Div;wire[15:0]LED_DATA;wire CK;wire[3:0]out;mux21 u1(SW[0],SW[1],SW[2],out);clk_div U8(clk_100mhz,1'b0,SW[2],Div,CK);LED_P2S #(.DATA_BITS(16),.DATA_COUNT_BITS(4)) PLED (clk_100mhz,1'b0,Div[20],LED_DATA,led_clk,led_clrn,led_sout,LED_PEN);assign LED_DATA = ~{out[0],out[1],out[2],out[3],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}; endmodule實驗三 數字加法器的設計
1.用VerilogHDL語言設計實現4位串行數字加法器和4位并行加法器,在ModelSim上仿真實現。
2.生成FPGA設計文件,下載到Sword實驗系統上驗證電路功能。
4位串行進位的全加器
module Fbs_add(input[3:0] Ra,input[3:0] Rb,input Cin,output reg[3:0] sum,output reg cout);reg [4:0]C;integer i;always@(Ra,Rb,Cin)beginC[0]=Cin;for(i=0;i<4;i=i+1)beginsum[i]=Ra[i]^Rb[i]^C[i];C[i+1]=(Ra[i]&Rb[i])|((Ra[i]^Rb[i])&C[i]);endcout=C[4];end endmodule4位并行進位的全加器
module Fbf_add(sum_out,c_out,a,b,c_in);input[3:0] a,b;input c_in;output[3:0] sum_out;output c_out;wire[4:0] c;wire[3:0] g,p;assign c[0]=c_in;assign p=a^b;assign g=a&b;assign c[1]=g[0]|(p[0]&c[0]);assign c[2]=g[1]|(p[1]&(g[0]|(p[0]&c[0])));assign c[3]=g[2]|(p[2]&(g[1]|(p[1]&(g[0]|(p[0]&c[0])))));assign c[4]=g[3]|(p[3]&(g[2]|(p[2]&(g[1]|(p[1]&(g[0]|(p[0]&c[0])))))));assign sum_out=p^c[3:0];assign c_out=c[4]; endmodule設計完成I/O引腳分配,選擇sw0-sw3給出第一個加數,sw4-sw7給出第二個加數,sw[15]為Ci的輸入,和在led0-led3顯示,進位位用led4顯示。
① 4位串行進位的全加器:
module adder(input wire clk_100mhz,input wire[15:0]SW,output wire led_clk,output wire led_clrn,output wire led_sout,output wire LED_PEN );wire[31:0]Div;wire[15:0]LED_DATA;wire CK;clk_div U8(clk_100mhz,1'b0,SW[2],Div,CK);LED_P2S #(.DATA_BITS(16),.DATA_COUNT_BITS(4)) PLED (clk_100mhz,1'b0,Div[20],LED_DATA,led_clk,led_clrn,led_sout,LED_PEN); wire[4:0] out;Fbs_add u9(SW[3:0],SW[7:4],SW[15],out[3:0],out[4]); assign LED_DATA = ~{out[0],out[1],out[2],out[3],out[4], 1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}; endmodule② 4位并行進位的全加器
module adder(input wire clk_100mhz,input wire[15:0]SW,output wire led_clk,output wire led_clrn,output wire led_sout,output wire LED_PEN); wire[31:0]Div; wire[15:0]LED_DATA; wire CK;clk_div U8(clk_100mhz,1'b0,SW[2],Div,CK);LED_P2S #(.DATA_BITS(16),.DATA_COUNT_BITS(4)) PLED (clk_100mhz,1'b0,Div[20],LED_DATA,led_clk,led_clrn,led_sout,LED_PEN); wire[4:0]out;Fbf_add u9(out[3:0],out[4],SW[3:0],SW[7:4],SW[15]); assign LED_DATA = ~{out[0],out[1],out[2],out[3],out[4], 1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0};endmodule(4)生成FPGA文檔,并下載到實驗板上物理運行,檢查設計結果。
實驗四 數碼管顯示
1.采用VerilogHDL語言編程實現輸入4位BCD碼,輸出是8位數碼管顯示碼。
程序代碼如下:
2.用Modelsim進行功能仿真。
測試代碼
module Seg7BCD_tb;reg [3:0] in;wire [7:0] out;Seg7BCD bcd(.in(in),.out(out));initialbeginin = 4'h0;#20 in = 4'h1;#20 in = 4'h2;#20 in = 4'h3;#20 in = 4'h4;#20 in = 4'h5;#20 in = 4'h6;#20 in = 4'h7;#20 in = 4'h8;#20 in = 4'h9;#20 in = 4'hA;#20 in = 4'hB;#20 in = 4'hC;#20 in = 4'hD;#20 in = 4'hE;#20 in = 4'hF;end endmodule仿真結果:
3.分別設計4位BCD碼自動生成模塊和BCD碼的譯碼模塊。
4位BCD碼生成模塊:
BCD碼的譯碼模塊:
module Seg7BCD(out, in);output [7:0] out;input [3:0] in;reg [7:0] out;always@(in)begincase(in)4'h0: out = 8'b00000011;4'h1: out = 8'b10011111;4'h2: out = 8'b00100101;4'h3: out = 8'b00001101;4'h4: out = 8'b10011001;4'h5: out = 8'b01001001;4'h6: out = 8'b01000001;4'h7: out = 8'b00011111;4'h8: out = 8'b00000001;4'h9: out = 8'b00001001;4'hA: out = 8'b00010001;4'hB: out = 8'b11000001;4'hC: out = 8'b01100011;4'hD: out = 8'b10000101;4'hE: out = 8'b01100001;4'hF: out = 8'b01110001;default: out = 8'hFE;endcaseend endmodule4.在頂層文件將2個電路模塊實例化,并進行相應的連線。
5. 在頂層文件將2個電路模塊實例化,并進行相應的連線。
實驗五 計數/定時器的設計
1.用VerilogHDL語言設計實現32位加法/減法二進制計數器,在ModelSim上實現功能仿真。
(1)用Verilog完成32bit加法計數器的行為描述設計。
module counter32(input clk,input rst_n,input select,output reg [31:0] clk_div);always @(posedge clk)beginif(rst_n)clk_div <= 32'b0; else if(select) //select:1加計數,0減計數clk_div <= clk_div + 1'b1 ; elseclk_div <= clk_div - 1'b1;end endmodule(2)完成modelsim下電路的功能仿真,驗證電路功能。
測試代碼:
仿真結果:
(3)設計完成I/O引腳分配。
系統時鐘為100MHz,作為計數時鐘。
采用sw[0]作為reset信號,將32bit的計數值在實驗板的八個七段數碼管上顯示。
2. 生成FPGA設計文件,下載到Sword實驗系統上驗證電路功能。
在上述基礎上,完成32位加減法計數器。首先完成modelsim下的加減法計數器功能仿真,其次采用sw[1]作為方向選擇信號,將加減法計數器的計數值在數碼管上顯示。
計數器實現:
加計數:
減計數:
實驗六 移位寄存器的設計
1.用VerilogHDL語言設計實現8位帶并行輸入的右移移位寄存器,在ModelSim上實現功能仿真。
(1)用Verilog語言采用結構描述或者行為描述方法設計一個僅帶有8bit并行輸入的右移移位寄存器。
module shiftregist1(D,clk,reset,Q);parameter shiftregist_width=8;output [shiftregist_width-1:0] D;input [shiftregist_width-1:0] Q;input clk,reset;reg [shiftregist_width-1:0] D;initialD=8'b00001111;always @(posedge clk or negedge reset)if(!reset)D<=Q;elseD<={D[shiftregist_width-2:0],D[shiftregist_width-1]}; endmodule(2)編寫測試模塊,完成modelsim下電路的功能仿真,驗證電路功能。
測試模塊:
仿真結果如下:
3)建立完成I/O引腳分配。
系統時鐘為100MHz,從提供的clkdiv引出clkdiv[24]作為移位控制時鐘。
測試移位寄存器時采用開關SW[0]~ SW[7]作為移位寄存器的并行輸入,SW[15]作為clr信號,將輸出顯示在led[0]~led[7]上(或同時顯示到led和數碼管上)。設置相應的約束文件。
2.生成FPGA設計文件,下載到Sword實驗系統上驗證電路功能。
設計結果:
在完成實驗的基礎上,設計實現實驗原理中圖2“帶有并行輸入的移位寄存器”電路模塊,并在modelsim下完成電路仿真。
電路設計模塊:
仿真測試模塊:
module shiftregister_tb;reg[7:0] data;reg din;reg clk;reg clr;reg sel;wire[7:0]q;shiftregister u1( .data(data),.din(din),.clk(clk),.clr(clr),.sel(sel),.q(q));always # 50 clk=~clk;initialbeginsel = 1'b1; clr = 1'b0; clk = 1'b0;#100 clr = 1'b1; din = 1'b1;#100 clr = 1'b1; din = 1'b1;#400 sel = 1'b0; clr = 1'b0; data = 8'b10010101;#200 clr = 1'b1;#100 clr = 1'b1; din = 1'b1;#100 clr = 1'b1; din = 1'b1;#400 sel = 1'b0; clr = 1'b0; data = 8'b10101001;#200 clr = 1'b1;end endmodule仿真結果:
代碼
1.shiftregist1.v
2.shiftregist1_tb.v
module shiftregist1_tb();wire [7:0] D;reg [7:0] Q;reg clk,reset;always #20 clk = ~clk;shiftregist1 u2(D,clk,reset,Q);initialbeginclk = 0;reset = 1;end endmodule3.shifter_top.v
`timescale 1ns / 1ps module shifter_top(input wire clk_100mhz,// I/O:input wire[15:0]SW,output wire led_clk,output wire led_clrn,output wire led_sout,output wire LED_PEN,output wire seg_clk,output wire seg_clrn,output wire seg_sout,output wire SEG_PEN);wire[31:0]Div;wire[15:0]LED_DATA;wire CK;wire[7:0]Q;wire [63:0] re;shiftregist1 U1(Q,Div[25],SW[0],SW[8:1]);Seg8BCD U0(re[7:0],Q[0]);Seg8BCD U2(re[15:8],Q[1]);Seg8BCD U3(re[23:16],Q[2]);Seg8BCD U4(re[31:24],Q[3]);Seg8BCD U5(re[39:32],Q[4]);Seg8BCD U6(re[47:40],Q[5]);Seg8BCD U7(re[55:48],Q[6]);Seg8BCD U9(re[63:56],Q[7]);clk_div U8(clk_100mhz,1'b0,SW[2],Div,CK); LED_P2S #(.DATA_BITS(16),.DATA_COUNT_BITS(4)) PLED (clk_100mhz,1'b0,Div[20],LED_DATA,led_clk,led_clrn,led_sout,LED_PEN); /* P2S #(.DATA_BITS(64),.DATA_COUNT_BITS(6))P7SEG (clk_100mhz,1'b0,Div[20],disp_data,seg_clk,seg_clrn,seg_sout,SEG_PEN);*/assign LED_DATA = ~{Q,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}; endmodule4.Seg8BCD.v
module Seg8BCD(out,in);output [7:0] out;input [3:0] in;reg [7:0] out;always @(in)begin case(in)4'h0: out = 8'b00000011;4'h1: out = 8'b10011111;4'h2: out = 8'b00100101;4'h3: out = 8'b00001101;4'h4: out = 8'b10011001;4'h5: out = 8'b01001001;4'h6: out = 8'b01000001;4'h7: out = 8'b00011111;4'h8: out = 8'b00000001;4'h9: out = 8'b00001001;4'hA: out = 8'b00010001;4'hB: out = 8'b11000001;4'hC: out = 8'b01100011;4'hD: out = 8'b10000101;4'hE: out = 8'b01100001;4'hF: out = 8'b01110001;default: out = 8'hFF;endcaseend endmodule實驗七 有限狀態機設計
1.理解并掌握檢測連續接收“111”的Moore型和Mealy型有限狀態機設計
Moore型:
//Moore狀態機的輸出僅依賴于當前狀態而與輸入無關。 module seqdata_moore(output reg dout,input wire clk,input wire rst,input wire din );reg [1:0] curr_state;reg [1:0] next_state;parameter ST0 = 2'b00;parameter ST1 = 2'b01;parameter ST2 = 2'b10;parameter ST3 = 2'b11;always@(posedge clk or negedge rst)beginif(!rst)curr_state <= ST0;elsecurr_state <= next_state;endalways@(*)begincase(curr_state)ST0: if(din == 1)next_state <= ST1;elsenext_state <= ST0;ST1: if(din == 1)next_state <= ST2;elsenext_state <= ST0;ST2: if(din == 1)next_state <= ST3;elsenext_state <= ST0;ST3: if(din == 1)next_state <= ST3;elsenext_state <= ST0;default:next_state <= ST0;endcaseend // 體現了Moore機的特點:輸出由當前狀態決定always@(*)beginif(curr_state == ST3)dout <= 1;elsedout <= 0;end endmoduleMealy型:
//Mealy狀態機的輸出與當前狀態和輸入有關。 module seqdata_mealy(output reg dout,input wire clk,input wire rst,input wire din );reg [1:0] curr_state;reg [1:0] next_state;parameter ST0 = 2'b00;parameter ST1 = 2'b01;parameter ST2 = 2'b11;always@(posedge clk or negedge rst)beginif(!rst)curr_state <= ST0;elsecurr_state <= next_state;endalways@(*)begincase(curr_state)ST0: if(din == 1)beginnext_state <= ST1;dout <= 0;endelsebeginnext_state <= ST0;dout <= 0;endST1: if(din == 1)beginnext_state <= ST2;dout <= 0;endelsebeginnext_state <= ST0;dout <= 0;endST2: if(din == 1)beginnext_state <= ST2;dout <= 1;endelsebeginnext_state <= ST0;dout <= 0;enddefault:beginnext_state <= ST0;dout <= 0;endendcaseend endmodule2. 設計并實現掌握檢測連續接收“1111”的Moore型和Mealy型狀態機設計。
要求:畫出Moore型和Mealy型的狀態轉移圖,并編寫代碼在modelsim上仿真實現。
Moore型:
設計代碼:
測試代碼:
module seqdata1111_moore_tb();wire dout;reg clk;reg rst;reg din;seqdata1111_moore U1(.dout(dout),.clk(clk),.rst(rst),.din(din));always #10 clk = ~clk;initialbeginclk = 0;rst = 0;din =0;#50 rst = 1;#20 din = 1;#20 din = 0;#20 din = 1;#40 din = 1;#20 din = 1;#60 din = 1;#20 din = 0;end endmodule仿真結果:
Mealy型:
設計代碼:
測試代碼:
module seqdata1111_mealy_tb();wire dout;reg clk;reg rst;reg din;seqdata1111_mealy U1(.dout(dout),.clk(clk),.rst(rst),.din(din));always #10 clk = ~clk;initialbeginclk = 0;rst = 0;din =0;#50 rst = 1;#20 din = 1;#20 din = 0;#20 din = 1;#40 din = 1;#20 din = 1;#60 din = 1;#20 din = 0;end endmodule仿真結果:
下板驗證:(Moore型)
3.在完成基本實驗的基礎上,嘗試設計檢測接收“1011”的Moore型和Mealy型有限狀態機的狀態轉移圖。然后編寫代碼,在modelsim上仿真測試驗證結果。
Moore型:
設計代碼:
測試代碼:
module seqdata1011_moore_tb();wire dout;reg clk;reg rst;reg din;seqdata1011_moore U1(.dout(dout),.clk(clk),.rst(rst),.din(din));always #10 clk = ~clk;initialbeginclk = 0; rst = 0; din = 0;#50 rst = 1;#20 din = 0;#20 din = 0;#20 din = 1;#20 din = 0;#20 din = 1;#40 din = 1;#20 din = 0;#20 din = 1;#20 din = 1;#20 din = 0;end endmodule仿真結果:
Mealy型:
設計代碼:
測試代碼:
module seqdata1011_mealy_tb();wire dout;reg clk;reg rst;reg din;seqdata1011_mealy U1(.dout(dout),.clk(clk),.rst(rst),.din(din));always #10 clk = ~clk;initialbeginclk = 0; rst = 0; din = 0;#50 rst = 1;#20 din = 0;#20 din = 0;#20 din = 1;#20 din = 0;#20 din = 1;#40 din = 1;#20 din = 0;#20 din = 1;#20 din = 1;#20 din = 0;end endmodule仿真結果:
實驗八 有限狀態機設計
1. 用Verilog HDL設計深度為32、位寬為8 bit的單端口RAM,在Modelsim上仿真測試。
設計代碼:
module RAM_signal(input clk,input[4:0]addm,input cs_n,input we_n,input[7:0]din,output[7:0]dout );reg[7:0]ram[31:0];always@(posedge clk)beginif(cs_n)dout <= 8'bzzzz_zzzz;elsebeginif(we_n)dout <= ram[addm];elseram[addm] <= din;endend endmodule測試代碼:
module RAM_signal_tb();//Inputs:reg clk;reg[4:0]addm;reg cs_n;reg we_n;reg[7:0]din;//Outputs:wire[7:0]dout;//Instantiate the:RAM_signal U1(.clk(clk),.addm(addm),.cs_n(cs_n),.we_n(we_n),.din(din),.dout(dout));initialbegin//Initialize Inputsclk=0;addm=0;cs_n=1;we_n=0;din = 0;#5 cs_n=0;#315 we_n=1;endalways #10 clk=~clk;initialbegin repeat(7)begin#40 addm=addm+1;din=din+1;end#40 repeat(7)#40 addm=addm-1;end endmodule仿真結果:
2.用Verilog HDL設計深度為8、位寬為8 bit的ROM。在Modelsim上仿真測試。
設計代碼:
module ROM( input clk,input cs_n, //0有效input[2:0]addm,output reg[7:0]dout);reg[7:0]rom[7:0]; //存儲器型變量聲明initialbeginrom[0]=8'h0;rom[1]=8'h1;rom[2]=8'h2;rom[3]=8'h3;rom[4]=8'h4;rom[5]=8'h5;rom[6]=8'h6;rom[7]=8'h7;endalways@(posedge clk)beginif(cs_n)dout <= 8'bzzzz_zzzz;elsedout <= rom[addm];end endmodule測試代碼:
module ROM_tb();//Inputs:reg clk;reg cs_n;reg[2:0]addm;//Outputs:wire[7:0]dout;//Instantiate the UnitROM U1(.clk(clk),.cs_n(cs_n),.addm(addm),.dout(dout));initialbegin//Initialize Inputs:clk=0;addm=0;cs_n=0;endalways #10 clk=~clk;initialbeginrepeat(7)#20 addm=addm+1;end endmodule仿真結果:
3.用Xilinx ISE/Vivado 生成單端口RAM的IP,并編寫測試文件,調試通過。
測試代碼:
module RAMIP_tb();//Inputs:reg[3:0]a;reg[7:0]d;reg clk;reg we;//Outputs:wire[7:0]spo;//Instantiate the Unit Test(u1)dist_mem_gen_0 u1 (.a(a), // input wire [3 : 0] a.d(d), // input wire [7 : 0] d.clk(clk), // input wire clk.we(we), // input wire we.spo(spo) // output wire [7 : 0] spo);always#20 clk=~clk;initialbeginclk=0;a=0;we=0;d=8'h0f;#640 we=1;#680 we=0;endinitialbeginrepeat(16) #40 a=a+1;#40 repeat(16)begin#40 a=a+1;d=d-1;end#40 repeat(16) #40 a=a+1;end endmodule仿真結果:
4. 用Xilinx ISE/Vivado 生成單端口ROM的IP,并編寫測試文件,調試通過。
測試代碼:
module ROMIP_tb();reg[3:0]a;wire[7:0]spo;dist_mem_gen_0 u1(.a(a),.spo(spo));always #20 a=a+1;initialbegina=0;end endmodule仿真結果:
5.將設計的RAM下載到FPGA板子上驗證。
頂層模塊:
`timescale 1ns / 1ps module RAM_top(input wire clk_100mhz,// I/O:input wire[15:0]SW,output wire led_clk,output wire led_clrn,output wire led_sout,output wire LED_PEN,output wire seg_clk,output wire seg_clrn,output wire seg_sout,output wire SEG_PEN );wire[31:0]Div;wire[15:0]LED_DATA;wire CK;wire[7:0]Q;clk_div U8(clk_100mhz,1'b0,SW[2],Div,CK);LED_P2S #(.DATA_BITS(16),.DATA_COUNT_BITS(4))PLED (clk_100mhz,1'b0,Div[20],LED_DATA,led_clk,led_clrn,led_sout,LED_PEN);RAM_signal U1(Div[24],SW[15:11],SW[10],SW[9],SW[7:0],Q[7:0]);assign LED_DATA = ~{Q[7],Q[6],Q[5],Q[4],Q[3],Q[2],Q[1],Q[0],1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,Div[24]}; endmodule實驗結果:
在00001號存儲單元寫入數據8’b11011101,再讀出到LED燈顯示。
總結
以上是生活随笔為你收集整理的Verilog HDL 实验题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL学习笔记(02)_别名
- 下一篇: 超好用的电脑清理工具!