日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Verilog HDL 实验题

發布時間:2023/12/20 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 endmodule

2.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 endmodule

3.設計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; endmodule

2.設計頂層電路,關聯外設,在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 endmodule

4位并行進位的全加器

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位數碼管顯示碼。



程序代碼如下:

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 endmodule

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碼生成模塊:

module BCDCode( input clk,input rst,output reg [3:0] BCDCode); always @ (posedge clk)if (rst) BCDCode = 0;else BCDCode = BCDCode + 1; endmodule

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 endmodule

4.在頂層文件將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下電路的功能仿真,驗證電路功能。
測試代碼:

module counter32_tb;reg clk;reg rst_n;reg select;wire[31:0] clk_div;always #50 clk = ~clk;counter32 u1(clk,rst_n,select,clk_div);initialbegin select = 1'b1; clk = 1'b0; rst_n = 1'b1;#100 select = 1'b0; rst_n = 1'b0; end endmodule

仿真結果:

(3)設計完成I/O引腳分配。
系統時鐘為100MHz,作為計數時鐘。
采用sw[0]作為reset信號,將32bit的計數值在實驗板的八個七段數碼管上顯示。

clk_div U10(clk_100mhz,1'b0,SW[2],Div,CK); tranform u11(Div[24],SW[0],seg); //計數器實例化 jishuqi u1(Div[24],SW[0],SW[1],out); //數碼管譯碼實例化 bcd_smg u9(out[3:0],seg[63:56]); bcd_smg u8(out[7:4],seg[55:48]); bcd_smg u7(out[11:8],seg[47:40]); bcd_smg u6(out[15:12],seg[39:32]); bcd_smg u5(out[19:16],seg[31:24]); bcd_smg u4(out[23:20],seg[23:16]); bcd_smg u3(out[27:24],seg[15:8]); bcd_smg u2(out[31:28],seg[7:0]);

2. 生成FPGA設計文件,下載到Sword實驗系統上驗證電路功能。



在上述基礎上,完成32位加減法計數器。首先完成modelsim下的加減法計數器功能仿真,其次采用sw[1]作為方向選擇信號,將加減法計數器的計數值在數碼管上顯示。
計數器實現:

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; //計數器實例化(top.v)jishuqi u1(Div[24],SW[0],SW[1],out);//數碼管譯碼實例化(top.v) bcd_smg u9(out[3:0],seg[63:56]);bcd_smg u8(out[7:4],seg[55:48]);bcd_smg u7(out[11:8],seg[47:40]);bcd_smg u6(out[15:12],seg[39:32]);bcd_smg u5(out[19:16],seg[31:24]);bcd_smg u4(out[23:20],seg[23:16]);bcd_smg u3(out[27:24],seg[15:8]);bcd_smg u2(out[31:28],seg[7:0]);

加計數:

減計數:

實驗六 移位寄存器的設計

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下電路的功能仿真,驗證電路功能。
測試模塊:

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 endmodule

仿真結果如下:

3)建立完成I/O引腳分配。
系統時鐘為100MHz,從提供的clkdiv引出clkdiv[24]作為移位控制時鐘。
測試移位寄存器時采用開關SW[0]~ SW[7]作為移位寄存器的并行輸入,SW[15]作為clr信號,將輸出顯示在led[0]~led[7]上(或同時顯示到led和數碼管上)。設置相應的約束文件。

shiftregist1 U1(Q,Div[25],SW[0],SW[8:1]); clk_div U8(clk_100mhz,1'b0,SW[2],Div,CK); 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]); assign LED_DATA = ~{Q,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0};

2.生成FPGA設計文件,下載到Sword實驗系統上驗證電路功能。


設計結果:


在完成實驗的基礎上,設計實現實驗原理中圖2“帶有并行輸入的移位寄存器”電路模塊,并在modelsim下完成電路仿真。
電路設計模塊:

module shiftregister(input [7:0] data,input din,input clk,input clr,input sel,output reg[7:0]q );wire [7:0] temp;always@(posedge clk)beginif(sel) //串行輸入beginif(!clr) //置0q <= 8'b00000000;elseq <= {din,q[7:1]}; //右移endelse //begin if(!clr) //置數q <= data;elseq <= {q[0],q[7:1]}; //右移endend endmodule

仿真測試模塊:

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

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.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 endmodule

3.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}; endmodule

4.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 endmodule

Mealy型:

//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 endmodule

2. 設計并實現掌握檢測連續接收“1111”的Moore型和Mealy型狀態機設計。

要求:畫出Moore型和Mealy型的狀態轉移圖,并編寫代碼在modelsim上仿真實現。
Moore型:

設計代碼:

module seqdata1111_moore(output reg dout,input wire clk,input wire rst,input wire din );reg [2:0] curr_state;reg [2:0] next_state;parameter ST0 = 3'b000;parameter ST1 = 3'b001;parameter ST2 = 3'b010;parameter ST3 = 3'b011;parameter ST4 = 3'b100;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 <= ST4;elsenext_state <= ST0;ST4: if(din == 1)next_state <= ST4;elsenext_state <= ST0;default: next_state <= ST0;endcaseendalways@(*)beginif(curr_state == ST4)dout = 1;elsedout = 0;end endmodule

測試代碼:

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(output reg dout,input wire clk,input wire rst,input wire din );reg [2:0] curr_state;reg [2:0] next_state;parameter ST0 = 3'b000;parameter ST1 = 3'b001;parameter ST2 = 3'b010;parameter ST3 = 3'b011;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;endcaseendalways@(*)beginif(curr_state == ST3)dout = 1;elsedout = 0;end endmodule

測試代碼:

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(output reg dout,input wire clk,input wire rst,input wire din );reg [3:0] curr_state;reg [3:0] next_state;parameter ST0 = 4'b0000;parameter ST1 = 4'b0001;parameter ST2 = 4'b0011;parameter ST3 = 4'b0111;parameter ST4 = 4'b1111;always @(posedge clk or negedge clk)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 == 0)next_state <= ST2;elsenext_state <= ST1;ST2: if(din == 1)next_state <= ST3;elsenext_state <= ST0;ST3: if(din == 1)next_state <= ST4;elsenext_state <= ST2;ST4: if(din == 1)next_state <= ST1;elsenext_state <= ST2;default: next_state <= ST0;endcaseendalways @(*)beginif(curr_state == ST4)dout = 1;elsedout = 0;end endmodule

測試代碼:

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(output reg dout,input wire clk,input wire rst,input wire din );reg [2:0] curr_state;reg [2:0] next_state;parameter ST0 = 3'b000;parameter ST1 = 3'b001;parameter ST2 = 3'b011;parameter ST3 = 3'b111;always @(posedge clk or negedge clk)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 == 0)beginnext_state <= ST2;dout = 0;endelsebeginnext_state <= ST0;dout = 0;endST2:if(din == 1)beginnext_state <= ST3;dout = 0;endelsebeginnext_state <= ST0;dout = 0;endST3:if(din == 1)beginnext_state <= ST3;dout = 1;endelsebeginnext_state <= ST0;dout = 0;enddefault: next_state <= ST0;endcaseend endmodule

測試代碼:

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 实验题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。